From fb4eba67032a370b35ed3b855368a9ab3a13c5d9 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Wed, 25 Dec 2019 18:07:05 +0000 Subject: [PATCH] Refactor. --- DiscImageChef.Core/Devices/Dumping/ATA.cs | 368 ++++----- .../Devices/Dumping/CompactDisc.cs | 733 +++++++++--------- DiscImageChef.Core/Devices/Dumping/Dump.cs | 185 ++--- DiscImageChef.Core/Devices/Dumping/MMC.cs | 129 +-- .../Devices/Dumping/PlayStationPortable.cs | 582 +++++++------- DiscImageChef.Core/Devices/Dumping/SBC.cs | 589 +++++++------- DiscImageChef.Core/Devices/Dumping/SCSI.cs | 123 +-- DiscImageChef.Core/Devices/Dumping/SSC.cs | 549 ++++++------- .../Devices/Dumping/SecureDigital.cs | 342 ++++---- DiscImageChef.Core/Devices/Dumping/XGD.cs | 527 ++++++------- DiscImageChef.Gui/Forms/frmDump.xeto.cs | 98 +-- DiscImageChef.sln.DotSettings | 1 + DiscImageChef/Commands/DumpMedia.cs | 157 ++-- 13 files changed, 2203 insertions(+), 2180 deletions(-) diff --git a/DiscImageChef.Core/Devices/Dumping/ATA.cs b/DiscImageChef.Core/Devices/Dumping/ATA.cs index 238eedbf8..e84dfefd2 100644 --- a/DiscImageChef.Core/Devices/Dumping/ATA.cs +++ b/DiscImageChef.Core/Devices/Dumping/ATA.cs @@ -53,9 +53,9 @@ namespace DiscImageChef.Core.Devices.Dumping /// Dumps an ATA device public void Ata() { - if(dumpRaw) + if(_dumpRaw) { - if(force) + if(_force) ErrorMessage?.Invoke("Raw dumping not yet supported in ATA devices, continuing..."); else { @@ -70,8 +70,8 @@ namespace DiscImageChef.Core.Devices.Dumping double imageWriteDuration = 0; UpdateStatus?.Invoke("Requesting ATA IDENTIFY DEVICE."); - dumpLog.WriteLine("Requesting ATA IDENTIFY DEVICE."); - bool sense = dev.AtaIdentify(out byte[] cmdBuf, out _); + _dumpLog.WriteLine("Requesting ATA IDENTIFY DEVICE."); + bool sense = _dev.AtaIdentify(out byte[] cmdBuf, out _); if(!sense && Identify.Decode(cmdBuf).HasValue) @@ -93,8 +93,8 @@ namespace DiscImageChef.Core.Devices.Dumping // Initializate reader UpdateStatus?.Invoke("Initializing reader."); - dumpLog.WriteLine("Initializing reader."); - var ataReader = new Reader(dev, TIMEOUT, ataIdentify); + _dumpLog.WriteLine("Initializing reader."); + var ataReader = new Reader(_dev, TIMEOUT, ataIdentify); // Fill reader blocks ulong blocks = ataReader.GetDeviceBlocks(); @@ -102,7 +102,7 @@ namespace DiscImageChef.Core.Devices.Dumping // Check block sizes if(ataReader.GetBlockSize()) { - dumpLog.WriteLine("ERROR: Cannot get block size: {0}.", ataReader.ErrorMessage); + _dumpLog.WriteLine("ERROR: Cannot get block size: {0}.", ataReader.ErrorMessage); ErrorMessage(ataReader.ErrorMessage); return; @@ -113,7 +113,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(ataReader.FindReadCommand()) { - dumpLog.WriteLine("ERROR: Cannot find correct read command: {0}.", ataReader.ErrorMessage); + _dumpLog.WriteLine("ERROR: Cannot find correct read command: {0}.", ataReader.ErrorMessage); ErrorMessage(ataReader.ErrorMessage); return; @@ -122,7 +122,7 @@ namespace DiscImageChef.Core.Devices.Dumping // Check how many blocks to read, if error show and return if(ataReader.GetBlocksToRead()) { - dumpLog.WriteLine("ERROR: Cannot get blocks to read: {0}.", ataReader.ErrorMessage); + _dumpLog.WriteLine("ERROR: Cannot get blocks to read: {0}.", ataReader.ErrorMessage); ErrorMessage(ataReader.ErrorMessage); return; @@ -141,23 +141,23 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke($"Device can read {blocksToRead} blocks at a time."); UpdateStatus?.Invoke($"Device reports {blockSize} bytes per logical block."); UpdateStatus?.Invoke($"Device reports {physicalsectorsize} bytes per physical block."); - dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * blockSize); + _dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * blockSize); - dumpLog.WriteLine("Device reports {0} cylinders {1} heads {2} sectors per track.", cylinders, heads, - sectors); + _dumpLog.WriteLine("Device reports {0} cylinders {1} heads {2} sectors per track.", cylinders, + heads, sectors); - dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); - dumpLog.WriteLine("Device reports {0} bytes per logical block.", blockSize); - dumpLog.WriteLine("Device reports {0} bytes per physical block.", physicalsectorsize); + _dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); + _dumpLog.WriteLine("Device reports {0} bytes per logical block.", blockSize); + _dumpLog.WriteLine("Device reports {0} bytes per physical block.", physicalsectorsize); - bool removable = !dev.IsCompactFlash && + bool removable = !_dev.IsCompactFlash && ataId.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.Removable); DumpHardwareType currentTry = null; ExtentsULong extents = null; - ResumeSupport.Process(ataReader.IsLba, removable, blocks, dev.Manufacturer, dev.Model, dev.Serial, - dev.PlatformId, ref resume, ref currentTry, ref extents); + ResumeSupport.Process(ataReader.IsLba, removable, blocks, _dev.Manufacturer, _dev.Model, + _dev.Serial, _dev.PlatformId, ref _resume, ref currentTry, ref extents); if(currentTry == null || extents == null) @@ -173,36 +173,36 @@ namespace DiscImageChef.Core.Devices.Dumping bool ret = true; - if(dev.IsUsb && - dev.UsbDescriptors != null && - !outputPlugin.SupportedMediaTags.Contains(MediaTagType.USB_Descriptors)) + if(_dev.IsUsb && + _dev.UsbDescriptors != null && + !_outputPlugin.SupportedMediaTags.Contains(MediaTagType.USB_Descriptors)) { ret = false; - dumpLog.WriteLine("Output format does not support USB descriptors."); + _dumpLog.WriteLine("Output format does not support USB descriptors."); ErrorMessage("Output format does not support USB descriptors."); } - if(dev.IsPcmcia && - dev.Cis != null && - !outputPlugin.SupportedMediaTags.Contains(MediaTagType.PCMCIA_CIS)) + if(_dev.IsPcmcia && + _dev.Cis != null && + !_outputPlugin.SupportedMediaTags.Contains(MediaTagType.PCMCIA_CIS)) { ret = false; - dumpLog.WriteLine("Output format does not support PCMCIA CIS descriptors."); + _dumpLog.WriteLine("Output format does not support PCMCIA CIS descriptors."); ErrorMessage("Output format does not support PCMCIA CIS descriptors."); } - if(!outputPlugin.SupportedMediaTags.Contains(MediaTagType.ATA_IDENTIFY)) + if(!_outputPlugin.SupportedMediaTags.Contains(MediaTagType.ATA_IDENTIFY)) { ret = false; - dumpLog.WriteLine("Output format does not support ATA IDENTIFY."); + _dumpLog.WriteLine("Output format does not support ATA IDENTIFY."); ErrorMessage("Output format does not support ATA IDENTIFY."); } if(!ret) { - dumpLog.WriteLine("Several media tags not supported, {0}continuing...", force ? "" : "not "); + _dumpLog.WriteLine("Several media tags not supported, {0}continuing...", _force ? "" : "not "); - if(force) + if(_force) ErrorMessage("Several media tags not supported, continuing..."); else { @@ -212,40 +212,40 @@ namespace DiscImageChef.Core.Devices.Dumping } } - ret = outputPlugin.Create(outputPath, - dev.IsCompactFlash ? MediaType.CompactFlash : MediaType.GENERIC_HDD, - formatOptions, blocks, blockSize); + ret = _outputPlugin.Create(_outputPath, + _dev.IsCompactFlash ? MediaType.CompactFlash : MediaType.GENERIC_HDD, + _formatOptions, blocks, blockSize); // Cannot create image if(!ret) { - dumpLog.WriteLine("Error creating output image, not continuing."); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Error creating output image, not continuing."); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error creating output image, not continuing." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } // Setting geometry - outputPlugin.SetGeometry(cylinders, heads, sectors); + _outputPlugin.SetGeometry(cylinders, heads, sectors); if(ataReader.IsLba) { UpdateStatus?.Invoke($"Reading {blocksToRead} sectors at a time."); - if(skip < blocksToRead) - skip = blocksToRead; + if(_skip < blocksToRead) + _skip = blocksToRead; - mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead); - ibgLog = new IbgLog(outputPrefix + ".ibg", ATA_PROFILE); + mhddLog = new MhddLog(_outputPrefix + ".mhddlog.bin", _dev, blocks, blockSize, blocksToRead); + ibgLog = new IbgLog(_outputPrefix + ".ibg", ATA_PROFILE); - if(resume.NextBlock > 0) + if(_resume.NextBlock > 0) { - UpdateStatus?.Invoke($"Resuming from block {resume.NextBlock}."); - dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock); + UpdateStatus?.Invoke($"Resuming from block {_resume.NextBlock}."); + _dumpLog.WriteLine("Resuming from block {0}.", _resume.NextBlock); } bool newTrim = false; @@ -255,13 +255,13 @@ namespace DiscImageChef.Core.Devices.Dumping ulong sectorSpeedStart = 0; InitProgress?.Invoke(); - for(ulong i = resume.NextBlock; i < blocks; i += blocksToRead) + for(ulong i = _resume.NextBlock; i < blocks; i += blocksToRead) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -289,38 +289,38 @@ namespace DiscImageChef.Core.Devices.Dumping mhddLog.Write(i, duration); ibgLog.Write(i, currentSpeed * 1024); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(cmdBuf, i, blocksToRead); + _outputPlugin.WriteSectors(cmdBuf, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); } else { - if(i + skip > blocks) - skip = (uint)(blocks - i); + if(i + _skip > blocks) + _skip = (uint)(blocks - i); - for(ulong b = i; b < i + skip; b++) - resume.BadBlocks.Add(b); + for(ulong b = i; b < i + _skip; b++) + _resume.BadBlocks.Add(b); mhddLog.Write(i, duration < 500 ? 65535 : duration); ibgLog.Write(i, 0); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(new byte[blockSize * skip], i, skip); + _outputPlugin.WriteSectors(new byte[blockSize * _skip], i, _skip); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; - dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", skip, i); - i += skip - blocksToRead; + _dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", _skip, i); + i += _skip - blocksToRead; newTrim = true; } - sectorSpeedStart += blocksToRead; - resume.NextBlock = i + blocksToRead; + sectorSpeedStart += blocksToRead; + _resume.NextBlock = i + blocksToRead; double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; if(elapsed < 1) continue; - currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed); + currentSpeed = (sectorSpeedStart * blockSize) / (1048576 * elapsed); sectorSpeedStart = 0; timeSpeedStart = DateTime.UtcNow; } @@ -329,46 +329,46 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); mhddLog.Close(); - ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, - blockSize * (double)(blocks + 1) / 1024 / - (totalDuration / 1000), devicePath); + ibgLog.Close(_dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, + (blockSize * (double)(blocks + 1)) / 1024 / + (totalDuration / 1000), _devicePath); UpdateStatus?.Invoke($"Dump finished in {(end - start).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average dump speed {(double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000):F3} KiB/sec."); + Invoke($"Average dump speed {((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000):F3} KiB/sec."); UpdateStatus?. - Invoke($"Average write speed {(double)blockSize * (double)(blocks + 1) / 1024 / imageWriteDuration:F3} KiB/sec."); + Invoke($"Average write speed {((double)blockSize * (double)(blocks + 1)) / 1024 / imageWriteDuration:F3} KiB/sec."); - dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); - dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000)); + _dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000)); - dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / imageWriteDuration); + _dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / imageWriteDuration); #region Trimming - if(resume.BadBlocks.Count > 0 && - !aborted && - !notrim && + if(_resume.BadBlocks.Count > 0 && + !_aborted && + !_notrim && newTrim) { start = DateTime.UtcNow; UpdateStatus?.Invoke("Trimming bad sectors"); - dumpLog.WriteLine("Trimming bad sectors"); + _dumpLog.WriteLine("Trimming bad sectors"); - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); InitProgress?.Invoke(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -382,44 +382,44 @@ namespace DiscImageChef.Core.Devices.Dumping if(error) continue; - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(cmdBuf, badSector); + _outputPlugin.WriteSector(cmdBuf, badSector); } EndProgress?.Invoke(); end = DateTime.UtcNow; UpdateStatus?.Invoke($"Trimmming finished in {(end - start).TotalSeconds} seconds."); - dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); } #endregion Trimming #region Error handling - if(resume.BadBlocks.Count > 0 && - !aborted && - retryPasses > 0) + if(_resume.BadBlocks.Count > 0 && + !_aborted && + _retryPasses > 0) { int pass = 1; bool forward = true; InitProgress?.Invoke(); repeatRetryLba: - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } PulseProgress?.Invoke(string.Format("Retrying sector {0}, pass {1}, {3}{2}", badSector, pass, forward ? "forward" : "reverse", - persistent ? "recovering partial data, " : "")); + _persistent ? "recovering partial data, " : "")); bool error = ataReader.ReadBlock(out cmdBuf, badSector, out duration); @@ -427,24 +427,24 @@ namespace DiscImageChef.Core.Devices.Dumping if(!error) { - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(cmdBuf, badSector); + _outputPlugin.WriteSector(cmdBuf, badSector); UpdateStatus?.Invoke($"Correctly retried block {badSector} in pass {pass}."); - dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); + _dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); } - else if(persistent) - outputPlugin.WriteSector(cmdBuf, badSector); + else if(_persistent) + _outputPlugin.WriteSector(cmdBuf, badSector); } - if(pass < retryPasses && - !aborted && - resume.BadBlocks.Count > 0) + if(pass < _retryPasses && + !_aborted && + _resume.BadBlocks.Count > 0) { pass++; forward = !forward; - resume.BadBlocks.Sort(); - resume.BadBlocks.Reverse(); + _resume.BadBlocks.Sort(); + _resume.BadBlocks.Reverse(); goto repeatRetryLba; } @@ -457,8 +457,8 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead); - ibgLog = new IbgLog(outputPrefix + ".ibg", ATA_PROFILE); + mhddLog = new MhddLog(_outputPrefix + ".mhddlog.bin", _dev, blocks, blockSize, blocksToRead); + ibgLog = new IbgLog(_outputPrefix + ".ibg", ATA_PROFILE); ulong currentBlock = 0; blocks = (ulong)(cylinders * heads * sectors); @@ -473,11 +473,11 @@ namespace DiscImageChef.Core.Devices.Dumping { for(byte sc = 1; sc < sectors; sc++) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -505,25 +505,25 @@ namespace DiscImageChef.Core.Devices.Dumping ibgLog.Write(currentBlock, currentSpeed * 1024); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSector(cmdBuf, - (ulong)((cy * heads + hd) * sectors + (sc - 1))); + _outputPlugin.WriteSector(cmdBuf, + (ulong)((((cy * heads) + hd) * sectors) + (sc - 1))); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(currentBlock); - dumpLog.WriteLine("Error reading cylinder {0} head {1} sector {2}.", cy, hd, - sc); + _dumpLog.WriteLine("Error reading cylinder {0} head {1} sector {2}.", cy, hd, + sc); } else { - resume.BadBlocks.Add(currentBlock); + _resume.BadBlocks.Add(currentBlock); mhddLog.Write(currentBlock, duration < 500 ? 65535 : duration); ibgLog.Write(currentBlock, 0); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSector(new byte[blockSize], - (ulong)((cy * heads + hd) * sectors + (sc - 1))); + _outputPlugin.WriteSector(new byte[blockSize], + (ulong)((((cy * heads) + hd) * sectors) + (sc - 1))); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; } @@ -536,7 +536,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(elapsed < 1) continue; - currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed); + currentSpeed = (sectorSpeedStart * blockSize) / (1048576 * elapsed); sectorSpeedStart = 0; timeSpeedStart = DateTime.UtcNow; } @@ -547,47 +547,47 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); mhddLog.Close(); - ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, - blockSize * (double)(blocks + 1) / 1024 / - (totalDuration / 1000), devicePath); + ibgLog.Close(_dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, + (blockSize * (double)(blocks + 1)) / 1024 / + (totalDuration / 1000), _devicePath); UpdateStatus?.Invoke($"Dump finished in {(end - start).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average dump speed {(double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000):F3} KiB/sec."); + Invoke($"Average dump speed {((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000):F3} KiB/sec."); UpdateStatus?. - Invoke($"Average write speed {(double)blockSize * (double)(blocks + 1) / 1024 / (imageWriteDuration / 1000):F3} KiB/sec."); + Invoke($"Average write speed {((double)blockSize * (double)(blocks + 1)) / 1024 / (imageWriteDuration / 1000):F3} KiB/sec."); - dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); - dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000)); + _dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000)); - dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / - (imageWriteDuration / 1000)); + _dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / + (imageWriteDuration / 1000)); } - foreach(ulong bad in resume.BadBlocks) - dumpLog.WriteLine("Sector {0} could not be read.", bad); + foreach(ulong bad in _resume.BadBlocks) + _dumpLog.WriteLine("Sector {0} could not be read.", bad); - outputPlugin.SetDumpHardware(resume.Tries); + _outputPlugin.SetDumpHardware(_resume.Tries); - if(preSidecar != null) - outputPlugin.SetCicmMetadata(preSidecar); + if(_preSidecar != null) + _outputPlugin.SetCicmMetadata(_preSidecar); - dumpLog.WriteLine("Closing output file."); + _dumpLog.WriteLine("Closing output file."); UpdateStatus?.Invoke("Closing output file."); DateTime closeStart = DateTime.Now; - outputPlugin.Close(); + _outputPlugin.Close(); DateTime closeEnd = DateTime.Now; UpdateStatus?.Invoke($"Closed in {(closeEnd - closeStart).TotalSeconds} seconds."); - dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); + _dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); - if(aborted) + if(_aborted) { - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); UpdateStatus?.Invoke("Aborted!"); return; @@ -595,12 +595,12 @@ namespace DiscImageChef.Core.Devices.Dumping double totalChkDuration = 0; - if(!nometadata) + if(!_nometadata) { - dumpLog.WriteLine("Creating sidecar."); + _dumpLog.WriteLine("Creating sidecar."); UpdateStatus?.Invoke("Creating sidecar."); var filters = new FiltersList(); - IFilter filter = filters.GetFilter(outputPath); + IFilter filter = filters.GetFilter(_outputPath); IMediaImage inputPlugin = ImageFormat.Detect(filter); if(!inputPlugin.Open(filter)) @@ -611,60 +611,64 @@ namespace DiscImageChef.Core.Devices.Dumping } DateTime chkStart = DateTime.UtcNow; - sidecarClass = new Sidecar(inputPlugin, outputPath, filter.Id, encoding); - sidecarClass.InitProgressEvent += InitProgress; - sidecarClass.UpdateProgressEvent += UpdateProgress; - sidecarClass.EndProgressEvent += EndProgress; - sidecarClass.InitProgressEvent2 += InitProgress2; - sidecarClass.UpdateProgressEvent2 += UpdateProgress2; - sidecarClass.EndProgressEvent2 += EndProgress2; - sidecarClass.UpdateStatusEvent += UpdateStatus; - CICMMetadataType sidecar = sidecarClass.Create(); - if(preSidecar != null) + _sidecarClass = + new Sidecar(inputPlugin, _outputPath, filter.Id, _encoding); + + _sidecarClass.InitProgressEvent += InitProgress; + _sidecarClass.UpdateProgressEvent += UpdateProgress; + _sidecarClass.EndProgressEvent += EndProgress; + _sidecarClass.InitProgressEvent2 += InitProgress2; + _sidecarClass.UpdateProgressEvent2 += UpdateProgress2; + _sidecarClass.EndProgressEvent2 += EndProgress2; + _sidecarClass.UpdateStatusEvent += UpdateStatus; + CICMMetadataType sidecar = _sidecarClass.Create(); + + if(_preSidecar != null) { - preSidecar.BlockMedia = sidecar.BlockMedia; - sidecar = preSidecar; + _preSidecar.BlockMedia = sidecar.BlockMedia; + sidecar = _preSidecar; } - if(dev.IsUsb && - dev.UsbDescriptors != null) + if(_dev.IsUsb && + _dev.UsbDescriptors != null) { - dumpLog.WriteLine("Reading USB descriptors."); + _dumpLog.WriteLine("Reading USB descriptors."); UpdateStatus?.Invoke("Reading USB descriptors."); - ret = outputPlugin.WriteMediaTag(dev.UsbDescriptors, MediaTagType.USB_Descriptors); + ret = _outputPlugin.WriteMediaTag(_dev.UsbDescriptors, MediaTagType.USB_Descriptors); if(ret) sidecar.BlockMedia[0].USB = new USBType { - ProductID = dev.UsbProductId, VendorID = dev.UsbVendorId, Descriptors = new DumpType - { - Image = outputPath, Size = (ulong)dev.UsbDescriptors.Length, - Checksums = Checksum.GetChecksums(dev.UsbDescriptors).ToArray() - } + ProductID = _dev.UsbProductId, VendorID = _dev.UsbVendorId, Descriptors = + new DumpType + { + Image = _outputPath, Size = (ulong)_dev.UsbDescriptors.Length, + Checksums = Checksum.GetChecksums(_dev.UsbDescriptors).ToArray() + } }; } - if(dev.IsPcmcia && - dev.Cis != null) + if(_dev.IsPcmcia && + _dev.Cis != null) { - dumpLog.WriteLine("Reading PCMCIA CIS."); + _dumpLog.WriteLine("Reading PCMCIA CIS."); UpdateStatus?.Invoke("Reading PCMCIA CIS."); - ret = outputPlugin.WriteMediaTag(dev.Cis, MediaTagType.PCMCIA_CIS); + ret = _outputPlugin.WriteMediaTag(_dev.Cis, MediaTagType.PCMCIA_CIS); if(ret) sidecar.BlockMedia[0].PCMCIA = new PCMCIAType { CIS = new DumpType { - Image = outputPath, Size = (ulong)dev.Cis.Length, - Checksums = Checksum.GetChecksums(dev.Cis).ToArray() + Image = _outputPath, Size = (ulong)_dev.Cis.Length, + Checksums = Checksum.GetChecksums(_dev.Cis).ToArray() } }; - dumpLog.WriteLine("Decoding PCMCIA CIS."); + _dumpLog.WriteLine("Decoding PCMCIA CIS."); UpdateStatus?.Invoke("Decoding PCMCIA CIS."); - Tuple[] tuples = CIS.GetTuples(dev.Cis); + Tuple[] tuples = CIS.GetTuples(_dev.Cis); if(tuples != null) foreach(Tuple tuple in tuples) @@ -676,8 +680,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(manfid != null) { - sidecar.BlockMedia[0].PCMCIA.ManufacturerCode = - manfid.ManufacturerID; + sidecar.BlockMedia[0].PCMCIA.ManufacturerCode = manfid.ManufacturerID; sidecar.BlockMedia[0].PCMCIA.CardCode = manfid.CardID; sidecar.BlockMedia[0].PCMCIA.ManufacturerCodeSpecified = true; @@ -704,14 +707,14 @@ namespace DiscImageChef.Core.Devices.Dumping } } - ret = outputPlugin.WriteMediaTag(ataIdentify, MediaTagType.ATA_IDENTIFY); + ret = _outputPlugin.WriteMediaTag(ataIdentify, MediaTagType.ATA_IDENTIFY); if(ret) sidecar.BlockMedia[0].ATA = new ATAType { Identify = new DumpType { - Image = outputPath, Size = (ulong)cmdBuf.Length, + Image = _outputPath, Size = (ulong)cmdBuf.Length, Checksums = Checksum.GetChecksums(cmdBuf).ToArray() } }; @@ -722,12 +725,13 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke($"Sidecar created in {(chkEnd - chkStart).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average checksum speed {(double)blockSize * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); + Invoke($"Average checksum speed {((double)blockSize * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); - dumpLog.WriteLine("Sidecar created in {0} seconds.", (chkEnd - chkStart).TotalSeconds); + _dumpLog.WriteLine("Sidecar created in {0} seconds.", (chkEnd - chkStart).TotalSeconds); - dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000)); + _dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / + (totalChkDuration / 1000)); List<(ulong start, string type)> filesystems = new List<(ulong start, string type)>(); @@ -746,15 +750,15 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?. Invoke($"Found filesystem {filesystem.type} at sector {filesystem.start}"); - dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, - filesystem.start); + _dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, + filesystem.start); } (string type, string subType) xmlType; - if(dev.IsCompactFlash) + if(_dev.IsCompactFlash) xmlType = CommonTypes.Metadata.MediaType.MediaTypeToString(MediaType.CompactFlash); - else if(dev.IsPcmcia) + else if(_dev.IsPcmcia) xmlType = CommonTypes.Metadata.MediaType.MediaTypeToString(MediaType.PCCardTypeI); else xmlType = CommonTypes.Metadata.MediaType.MediaTypeToString(MediaType.GENERIC_HDD); @@ -765,9 +769,9 @@ namespace DiscImageChef.Core.Devices.Dumping sidecar.BlockMedia[0].LogicalBlocks = blocks; sidecar.BlockMedia[0].PhysicalBlockSize = physicalsectorsize; sidecar.BlockMedia[0].LogicalBlockSize = blockSize; - sidecar.BlockMedia[0].Manufacturer = dev.Manufacturer; - sidecar.BlockMedia[0].Model = dev.Model; - sidecar.BlockMedia[0].Serial = dev.Serial; + sidecar.BlockMedia[0].Manufacturer = _dev.Manufacturer; + sidecar.BlockMedia[0].Model = _dev.Model; + sidecar.BlockMedia[0].Serial = _dev.Serial; sidecar.BlockMedia[0].Size = blocks * blockSize; if(cylinders > 0 && @@ -784,7 +788,7 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke("Writing metadata sidecar"); - var xmlFs = new FileStream(outputPrefix + ".cicm.xml", FileMode.Create); + var xmlFs = new FileStream(_outputPrefix + ".cicm.xml", FileMode.Create); var xmlSer = new XmlSerializer(typeof(CICMMetadataType)); xmlSer.Serialize(xmlFs, sidecar); @@ -797,21 +801,21 @@ namespace DiscImageChef.Core.Devices.Dumping Invoke($"Took a total of {(end - start).TotalSeconds:F3} seconds ({totalDuration / 1000:F3} processing commands, {totalChkDuration / 1000:F3} checksumming, {imageWriteDuration:F3} writing, {(closeEnd - closeStart).TotalSeconds:F3} closing)."); UpdateStatus?. - Invoke($"Average speed: {(double)blockSize * (double)(blocks + 1) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); + Invoke($"Average speed: {((double)blockSize * (double)(blocks + 1)) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); UpdateStatus?.Invoke($"Fastest speed burst: {maxSpeed:F3} MiB/sec."); UpdateStatus?.Invoke($"Slowest speed burst: {minSpeed:F3} MiB/sec."); - UpdateStatus?.Invoke($"{resume.BadBlocks.Count} sectors could not be read."); + UpdateStatus?.Invoke($"{_resume.BadBlocks.Count} sectors could not be read."); - if(resume.BadBlocks.Count > 0) - resume.BadBlocks.Sort(); + if(_resume.BadBlocks.Count > 0) + _resume.BadBlocks.Sort(); UpdateStatus?.Invoke(""); } - if(dev.IsCompactFlash) + if(_dev.IsCompactFlash) Statistics.AddMedia(MediaType.CompactFlash, true); - else if(dev.IsPcmcia) + else if(_dev.IsPcmcia) Statistics.AddMedia(MediaType.PCCardTypeI, true); else Statistics.AddMedia(MediaType.GENERIC_HDD, true); diff --git a/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs b/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs index e002cb64a..1dcf43a1b 100644 --- a/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs +++ b/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs @@ -118,22 +118,19 @@ namespace DiscImageChef.Core.Devices.Dumping List trackList = new List(); // Tracks in disc Track[] tracks; // Tracks in disc as array - Dictionary - mediaTags = new Dictionary(); // Media tags + Dictionary mediaTags = new Dictionary(); // Media tags - int firstTrackLastSession = - 0; // Number of first track in last session + int firstTrackLastSession = 0; // Number of first track in last session - MmcSubchannel - supportedSubchannel; // Drive's maximum supported subchannel + MmcSubchannel supportedSubchannel; // Drive's maximum supported subchannel DateTime timeSpeedStart; // Time of start for speed calculation dskType = MediaType.CD; - if(dumpRaw) + if(_dumpRaw) { - dumpLog.WriteLine("Raw CD dumping not yet implemented"); + _dumpLog.WriteLine("Raw CD dumping not yet implemented"); StoppingErrorMessage?.Invoke("Raw CD dumping not yet implemented"); return; @@ -143,19 +140,19 @@ namespace DiscImageChef.Core.Devices.Dumping ctx = DicContext.Create(Settings.Settings.MasterDbPath); // Search for device in master database - dbDev = ctx.Devices.FirstOrDefault(d => d.Manufacturer == dev.Manufacturer && d.Model == dev.Model && - d.Revision == dev.Revision); + dbDev = ctx.Devices.FirstOrDefault(d => d.Manufacturer == _dev.Manufacturer && d.Model == _dev.Model && + d.Revision == _dev.Revision); if(dbDev is null) { - dumpLog.WriteLine("Device not in database, please create a device report and attach it to a Github issue."); + _dumpLog.WriteLine("Device not in database, please create a device report and attach it to a Github issue."); UpdateStatus?. Invoke("Device not in database, please create a device report and attach it to a Github issue."); } else { - dumpLog.WriteLine($"Device in database since {dbDev.LastSynchronized}."); + _dumpLog.WriteLine($"Device in database since {dbDev.LastSynchronized}."); UpdateStatus?.Invoke($"Device in database since {dbDev.LastSynchronized}."); if(dbDev.OptimalMultipleSectorsRead > 0) @@ -163,47 +160,47 @@ namespace DiscImageChef.Core.Devices.Dumping } // Search for read offset in master database - cdOffset = ctx.CdOffsets.FirstOrDefault(d => d.Manufacturer == dev.Manufacturer && d.Model == dev.Model); + cdOffset = ctx.CdOffsets.FirstOrDefault(d => d.Manufacturer == _dev.Manufacturer && d.Model == _dev.Model); if(cdOffset is null) { - dumpLog.WriteLine("CD reading offset not found in database."); + _dumpLog.WriteLine("CD reading offset not found in database."); UpdateStatus?.Invoke("CD reading offset not found in database."); } else { - dumpLog.WriteLine($"CD reading offset is {cdOffset.Offset} samples."); + _dumpLog.WriteLine($"CD reading offset is {cdOffset.Offset} samples."); UpdateStatus?.Invoke($"CD reading offset is {cdOffset.Offset} samples."); } supportedSubchannel = MmcSubchannel.Raw; - dumpLog.WriteLine("Checking if drive supports full raw subchannel reading..."); + _dumpLog.WriteLine("Checking if drive supports full raw subchannel reading..."); UpdateStatus?.Invoke("Checking if drive supports full raw subchannel reading..."); - readcd = !dev.ReadCd(out cmdBuf, out senseBuf, 0, sectorSize + 96, 1, MmcSectorTypes.AllTypes, false, false, - true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, supportedSubchannel, - dev.Timeout, out _); + readcd = !_dev.ReadCd(out cmdBuf, out senseBuf, 0, sectorSize + 96, 1, MmcSectorTypes.AllTypes, false, + false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, _dev.Timeout, out _); if(readcd) { - dumpLog.WriteLine("Full raw subchannel reading supported..."); + _dumpLog.WriteLine("Full raw subchannel reading supported..."); UpdateStatus?.Invoke("Full raw subchannel reading supported..."); subSize = 96; } else { supportedSubchannel = MmcSubchannel.Q16; - dumpLog.WriteLine("Checking if drive supports PQ subchannel reading..."); + _dumpLog.WriteLine("Checking if drive supports PQ subchannel reading..."); UpdateStatus?.Invoke("Checking if drive supports PQ subchannel reading..."); - readcd = !dev.ReadCd(out cmdBuf, out senseBuf, 0, sectorSize + 16, 1, MmcSectorTypes.AllTypes, false, - false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, - supportedSubchannel, dev.Timeout, out _); + readcd = !_dev.ReadCd(out cmdBuf, out senseBuf, 0, sectorSize + 16, 1, MmcSectorTypes.AllTypes, false, + false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, _dev.Timeout, out _); if(readcd) { - dumpLog.WriteLine("PQ subchannel reading supported..."); - dumpLog.WriteLine("WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); + _dumpLog.WriteLine("PQ subchannel reading supported..."); + _dumpLog.WriteLine("WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); UpdateStatus?.Invoke("PQ subchannel reading supported..."); UpdateStatus?. @@ -214,45 +211,45 @@ namespace DiscImageChef.Core.Devices.Dumping else { supportedSubchannel = MmcSubchannel.None; - dumpLog.WriteLine("Checking if drive supports reading without subchannel..."); + _dumpLog.WriteLine("Checking if drive supports reading without subchannel..."); UpdateStatus?.Invoke("Checking if drive supports reading without subchannel..."); - readcd = !dev.ReadCd(out cmdBuf, out senseBuf, 0, sectorSize, 1, MmcSectorTypes.AllTypes, false, - false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, - supportedSubchannel, dev.Timeout, out _); + readcd = !_dev.ReadCd(out cmdBuf, out senseBuf, 0, sectorSize, 1, MmcSectorTypes.AllTypes, false, + false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, _dev.Timeout, out _); if(!readcd) { - dumpLog.WriteLine("Drive does not support READ CD, trying SCSI READ commands..."); + _dumpLog.WriteLine("Drive does not support READ CD, trying SCSI READ commands..."); ErrorMessage?.Invoke("Drive does not support READ CD, trying SCSI READ commands..."); - dumpLog.WriteLine("Checking if drive supports READ(6)..."); + _dumpLog.WriteLine("Checking if drive supports READ(6)..."); UpdateStatus?.Invoke("Checking if drive supports READ(6)..."); - read6 = !dev.Read6(out cmdBuf, out senseBuf, 0, 2048, 1, dev.Timeout, out _); - dumpLog.WriteLine("Checking if drive supports READ(10)..."); + read6 = !_dev.Read6(out cmdBuf, out senseBuf, 0, 2048, 1, _dev.Timeout, out _); + _dumpLog.WriteLine("Checking if drive supports READ(10)..."); UpdateStatus?.Invoke("Checking if drive supports READ(10)..."); - read10 = !dev.Read10(out cmdBuf, out senseBuf, 0, false, true, false, false, 0, 2048, 0, 1, - dev.Timeout, out _); + read10 = !_dev.Read10(out cmdBuf, out senseBuf, 0, false, true, false, false, 0, 2048, 0, 1, + _dev.Timeout, out _); - dumpLog.WriteLine("Checking if drive supports READ(12)..."); + _dumpLog.WriteLine("Checking if drive supports READ(12)..."); UpdateStatus?.Invoke("Checking if drive supports READ(12)..."); - read12 = !dev.Read12(out cmdBuf, out senseBuf, 0, false, true, false, false, 0, 2048, 0, 1, - false, dev.Timeout, out _); + read12 = !_dev.Read12(out cmdBuf, out senseBuf, 0, false, true, false, false, 0, 2048, 0, 1, + false, _dev.Timeout, out _); - dumpLog.WriteLine("Checking if drive supports READ(16)..."); + _dumpLog.WriteLine("Checking if drive supports READ(16)..."); UpdateStatus?.Invoke("Checking if drive supports READ(16)..."); - read16 = !dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, 0, 2048, 0, 1, false, - dev.Timeout, out _); + read16 = !_dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, 0, 2048, 0, 1, false, + _dev.Timeout, out _); if(!read6 && !read10 && !read12 && !read16) { - dumpLog.WriteLine("Cannot read from disc, not continuing..."); + _dumpLog.WriteLine("Cannot read from disc, not continuing..."); StoppingErrorMessage?.Invoke("Cannot read from disc, not continuing..."); return; @@ -260,31 +257,31 @@ namespace DiscImageChef.Core.Devices.Dumping if(read6) { - dumpLog.WriteLine("Drive supports READ(6)..."); + _dumpLog.WriteLine("Drive supports READ(6)..."); UpdateStatus?.Invoke("Drive supports READ(6)..."); } if(read10) { - dumpLog.WriteLine("Drive supports READ(10)..."); + _dumpLog.WriteLine("Drive supports READ(10)..."); UpdateStatus?.Invoke("Drive supports READ(10)..."); } if(read12) { - dumpLog.WriteLine("Drive supports READ(12)..."); + _dumpLog.WriteLine("Drive supports READ(12)..."); UpdateStatus?.Invoke("Drive supports READ(12)..."); } if(read16) { - dumpLog.WriteLine("Drive supports READ(16)..."); + _dumpLog.WriteLine("Drive supports READ(16)..."); UpdateStatus?.Invoke("Drive supports READ(16)..."); } } - dumpLog.WriteLine("Drive can only read without subchannel..."); - dumpLog.WriteLine("WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); + _dumpLog.WriteLine("Drive can only read without subchannel..."); + _dumpLog.WriteLine("WARNING: If disc says CD+G, CD+EG, CD-MIDI, CD Graphics or CD Enhanced Graphics, dump will be incorrect!"); UpdateStatus?.Invoke("Drive can only read without subchannel..."); UpdateStatus?. @@ -295,17 +292,17 @@ namespace DiscImageChef.Core.Devices.Dumping } // Check if output format supports subchannels - if(!outputPlugin.SupportedSectorTags.Contains(SectorTagType.CdSectorSubchannel) && + if(!_outputPlugin.SupportedSectorTags.Contains(SectorTagType.CdSectorSubchannel) && supportedSubchannel != MmcSubchannel.None) { - if(!force) + if(!_force) { - dumpLog.WriteLine("Output format does not support subchannels, continuing..."); + _dumpLog.WriteLine("Output format does not support subchannels, continuing..."); UpdateStatus?.Invoke("Output format does not support subchannels, continuing..."); } else { - dumpLog.WriteLine("Output format does not support subchannels, not continuing..."); + _dumpLog.WriteLine("Output format does not support subchannels, not continuing..."); StoppingErrorMessage?.Invoke("Output format does not support subchannels, not continuing..."); return; @@ -332,7 +329,7 @@ namespace DiscImageChef.Core.Devices.Dumping break; default: - dumpLog.WriteLine("Handling subchannel type {0} not supported, exiting...", supportedSubchannel); + _dumpLog.WriteLine("Handling subchannel type {0} not supported, exiting...", supportedSubchannel); StoppingErrorMessage?. Invoke($"Handling subchannel type {supportedSubchannel} not supported, exiting..."); @@ -342,9 +339,9 @@ namespace DiscImageChef.Core.Devices.Dumping // We discarded all discs that falsify a TOC before requesting a real TOC // No TOC, no CD (or an empty one) - dumpLog.WriteLine("Reading full TOC"); + _dumpLog.WriteLine("Reading full TOC"); UpdateStatus?.Invoke("Reading full TOC"); - sense = dev.ReadRawToc(out cmdBuf, out senseBuf, 0, dev.Timeout, out _); + sense = _dev.ReadRawToc(out cmdBuf, out senseBuf, 0, _dev.Timeout, out _); if(!sense) { @@ -359,7 +356,7 @@ namespace DiscImageChef.Core.Devices.Dumping } UpdateStatus?.Invoke("Building track map..."); - dumpLog.WriteLine("Building track map..."); + _dumpLog.WriteLine("Building track map..."); if(toc.HasValue) { @@ -453,15 +450,15 @@ namespace DiscImageChef.Core.Devices.Dumping else { UpdateStatus?.Invoke("Cannot read RAW TOC, requesting processed one..."); - dumpLog.WriteLine("Cannot read RAW TOC, requesting processed one..."); - sense = dev.ReadToc(out cmdBuf, out senseBuf, false, 0, dev.Timeout, out _); + _dumpLog.WriteLine("Cannot read RAW TOC, requesting processed one..."); + sense = _dev.ReadToc(out cmdBuf, out senseBuf, false, 0, _dev.Timeout, out _); TOC.CDTOC? oldToc = TOC.Decode(cmdBuf); if((sense || !oldToc.HasValue) && - !force) + !_force) { - dumpLog.WriteLine("Could not read TOC, if you want to continue, use force, and will try from LBA 0 to 360000..."); + _dumpLog.WriteLine("Could not read TOC, if you want to continue, use force, and will try from LBA 0 to 360000..."); StoppingErrorMessage?. Invoke("Could not read TOC, if you want to continue, use force, and will try from LBA 0 to 360000..."); @@ -501,7 +498,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(trackList.Count == 0) { UpdateStatus?.Invoke("No tracks found, adding a single track from 0 to Lead-Out"); - dumpLog.WriteLine("No tracks found, adding a single track from 0 to Lead-Out"); + _dumpLog.WriteLine("No tracks found, adding a single track from 0 to Lead-Out"); trackList.Add(new Track { @@ -516,7 +513,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(lastSector == 0) { - sense = dev.ReadCapacity16(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadCapacity16(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(!sense) { @@ -529,7 +526,7 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - sense = dev.ReadCapacity(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadCapacity(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(!sense) { @@ -540,12 +537,12 @@ namespace DiscImageChef.Core.Devices.Dumping if(lastSector <= 0) { - if(!force) + if(!_force) { StoppingErrorMessage?. Invoke("Could not find Lead-Out, if you want to continue use force option and will continue until 360000 sectors..."); - dumpLog. + _dumpLog. WriteLine("Could not find Lead-Out, if you want to continue use force option and will continue until 360000 sectors..."); return; @@ -554,7 +551,7 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?. Invoke("WARNING: Could not find Lead-Out start, will try to read up to 360000 sectors, probably will fail before..."); - dumpLog.WriteLine("WARNING: Could not find Lead-Out start, will try to read up to 360000 sectors, probably will fail before..."); + _dumpLog.WriteLine("WARNING: Could not find Lead-Out start, will try to read up to 360000 sectors, probably will fail before..."); lastSector = 360000; } } @@ -574,8 +571,8 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - ResumeSupport.Process(true, true, blocks, dev.Manufacturer, dev.Model, dev.Serial, dev.PlatformId, - ref resume, ref currentTry, ref extents); + ResumeSupport.Process(true, true, blocks, _dev.Manufacturer, _dev.Model, _dev.Serial, _dev.PlatformId, + ref _resume, ref currentTry, ref extents); if(currentTry == null || extents == null) @@ -586,9 +583,9 @@ namespace DiscImageChef.Core.Devices.Dumping } // ATIP exists on blank CDs - dumpLog.WriteLine("Reading ATIP"); + _dumpLog.WriteLine("Reading ATIP"); UpdateStatus?.Invoke("Reading ATIP"); - sense = dev.ReadAtip(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadAtip(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(!sense) { @@ -605,11 +602,11 @@ namespace DiscImageChef.Core.Devices.Dumping } } - dumpLog.WriteLine("Reading Disc Information"); + _dumpLog.WriteLine("Reading Disc Information"); UpdateStatus?.Invoke("Reading Disc Information"); - sense = dev.ReadDiscInformation(out cmdBuf, out senseBuf, MmcDiscInformationDataTypes.DiscInformation, - dev.Timeout, out _); + sense = _dev.ReadDiscInformation(out cmdBuf, out senseBuf, MmcDiscInformationDataTypes.DiscInformation, + _dev.Timeout, out _); if(!sense) { @@ -630,9 +627,9 @@ namespace DiscImageChef.Core.Devices.Dumping } } - dumpLog.WriteLine("Reading PMA"); + _dumpLog.WriteLine("Reading PMA"); UpdateStatus?.Invoke("Reading PMA"); - sense = dev.ReadPma(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadPma(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(!sense && PMA.Decode(cmdBuf).HasValue) @@ -642,9 +639,9 @@ namespace DiscImageChef.Core.Devices.Dumping mediaTags.Add(MediaTagType.CD_PMA, tmpBuf); } - dumpLog.WriteLine("Reading Session Information"); + _dumpLog.WriteLine("Reading Session Information"); UpdateStatus?.Invoke("Reading Session Information"); - sense = dev.ReadSessionInfo(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadSessionInfo(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(!sense) { @@ -657,9 +654,9 @@ namespace DiscImageChef.Core.Devices.Dumping } } - dumpLog.WriteLine("Reading CD-Text from Lead-In"); + _dumpLog.WriteLine("Reading CD-Text from Lead-In"); UpdateStatus?.Invoke("Reading CD-Text from Lead-In"); - sense = dev.ReadCdText(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadCdText(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(!sense && CDTextOnLeadIn.Decode(cmdBuf).HasValue) @@ -672,17 +669,17 @@ namespace DiscImageChef.Core.Devices.Dumping // Check if output format supports all disc tags we have retrieved so far foreach(MediaTagType tag in mediaTags.Keys) { - if(outputPlugin.SupportedMediaTags.Contains(tag)) + if(_outputPlugin.SupportedMediaTags.Contains(tag)) continue; - if(!force) + if(!_force) { - dumpLog.WriteLine("Output format does not support {0}, continuing...", tag); + _dumpLog.WriteLine("Output format does not support {0}, continuing...", tag); ErrorMessage?.Invoke($"Output format does not support {tag}, continuing..."); } else { - dumpLog.WriteLine("Output format does not support {0}, not continuing...", tag); + _dumpLog.WriteLine("Output format does not support {0}, not continuing...", tag); StoppingErrorMessage?.Invoke($"Output format does not support {tag}, not continuing..."); return; @@ -717,16 +714,16 @@ namespace DiscImageChef.Core.Devices.Dumping // Check for hidden data before start of track 1 if(tracks.First(t => t.TrackSequence == 1).TrackStartSector > 0 && readcd) { - dumpLog.WriteLine("First track starts after sector 0, checking for a hidden track..."); + _dumpLog.WriteLine("First track starts after sector 0, checking for a hidden track..."); UpdateStatus?.Invoke("First track starts after sector 0, checking for a hidden track..."); - sense = dev.ReadCd(out cmdBuf, out senseBuf, 0, blockSize, 1, MmcSectorTypes.AllTypes, false, false, - true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, supportedSubchannel, - dev.Timeout, out _); + sense = _dev.ReadCd(out cmdBuf, out senseBuf, 0, blockSize, 1, MmcSectorTypes.AllTypes, false, false, + true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, _dev.Timeout, out _); - if(dev.Error || sense) + if(_dev.Error || sense) { - dumpLog.WriteLine("Could not read sector 0, continuing..."); + _dumpLog.WriteLine("Could not read sector 0, continuing..."); UpdateStatus?.Invoke("Could not read sector 0, continuing..."); } else @@ -749,11 +746,11 @@ namespace DiscImageChef.Core.Devices.Dumping if(hiddenData && cmdBuf[0xF] == 2) { - sense = dev.ReadCd(out cmdBuf, out senseBuf, 16, blockSize, 1, MmcSectorTypes.AllTypes, false, - false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, - supportedSubchannel, dev.Timeout, out _); + sense = _dev.ReadCd(out cmdBuf, out senseBuf, 16, blockSize, 1, MmcSectorTypes.AllTypes, false, + false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, _dev.Timeout, out _); - if(!dev.Error && + if(!_dev.Error && !sense) { testMark = new byte[4]; @@ -788,7 +785,7 @@ namespace DiscImageChef.Core.Devices.Dumping dskType == MediaType.CDROMXA) { // TODO: Add other detectors here - dumpLog.WriteLine("Detecting disc type..."); + _dumpLog.WriteLine("Detecting disc type..."); UpdateStatus?.Invoke("Detecting disc type..."); bool hasDataTrack = false; @@ -842,17 +839,17 @@ namespace DiscImageChef.Core.Devices.Dumping for(int i = 0; i < 9; i++) { - sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, 2352, 1, MmcSectorTypes.AllTypes, false, - false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, - MmcSubchannel.None, dev.Timeout, out _); + sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, 2352, 1, MmcSectorTypes.AllTypes, false, + false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + MmcSubchannel.None, _dev.Timeout, out _); - if(sense || dev.Error) + if(sense || _dev.Error) { - sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, 2352, 1, MmcSectorTypes.Cdda, false, - false, true, MmcHeaderCodes.None, true, true, MmcErrorField.None, - MmcSubchannel.None, dev.Timeout, out _); + sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, 2352, 1, MmcSectorTypes.Cdda, false, + false, true, MmcHeaderCodes.None, true, true, MmcErrorField.None, + MmcSubchannel.None, _dev.Timeout, out _); - if(sense || !dev.Error) + if(sense || !_dev.Error) { videoNowColorFrame = null; @@ -880,16 +877,16 @@ namespace DiscImageChef.Core.Devices.Dumping if(tracks[t].TrackType == TrackType.Audio) continue; - dumpLog.WriteLine("Checking mode for track {0}...", tracks[t].TrackSequence); + _dumpLog.WriteLine("Checking mode for track {0}...", tracks[t].TrackSequence); UpdateStatus?.Invoke($"Checking mode for track {tracks[t].TrackSequence}..."); - sense = !dev.ReadCd(out cmdBuf, out senseBuf, (uint)tracks[t].TrackStartSector, blockSize, 1, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true, - MmcErrorField.None, supportedSubchannel, dev.Timeout, out _); + sense = !_dev.ReadCd(out cmdBuf, out senseBuf, (uint)tracks[t].TrackStartSector, blockSize, 1, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true, + MmcErrorField.None, supportedSubchannel, _dev.Timeout, out _); if(!sense) { - dumpLog.WriteLine("Unable to guess mode for track {0}, continuing...", tracks[t].TrackSequence); + _dumpLog.WriteLine("Unable to guess mode for track {0}, continuing...", tracks[t].TrackSequence); UpdateStatus?.Invoke($"Unable to guess mode for track {tracks[t].TrackSequence}, continuing..."); continue; @@ -899,7 +896,7 @@ namespace DiscImageChef.Core.Devices.Dumping { case 1: UpdateStatus?.Invoke($"Track {tracks[t].TrackSequence} is MODE1"); - dumpLog.WriteLine("Track {0} is MODE1", tracks[t].TrackSequence); + _dumpLog.WriteLine("Track {0} is MODE1", tracks[t].TrackSequence); tracks[t].TrackType = TrackType.CdMode1; break; @@ -908,7 +905,7 @@ namespace DiscImageChef.Core.Devices.Dumping dskType == MediaType.CDIREADY) { UpdateStatus?.Invoke($"Track {tracks[t].TrackSequence} is MODE2"); - dumpLog.WriteLine("Track {0} is MODE2", tracks[t].TrackSequence); + _dumpLog.WriteLine("Track {0} is MODE2", tracks[t].TrackSequence); tracks[t].TrackType = TrackType.CdMode2Formless; break; @@ -917,14 +914,14 @@ namespace DiscImageChef.Core.Devices.Dumping if((cmdBuf[0x012] & 0x20) == 0x20) // mode 2 form 2 { UpdateStatus?.Invoke($"Track {tracks[t].TrackSequence} is MODE2 FORM 2"); - dumpLog.WriteLine("Track {0} is MODE2 FORM 2", tracks[t].TrackSequence); + _dumpLog.WriteLine("Track {0} is MODE2 FORM 2", tracks[t].TrackSequence); tracks[t].TrackType = TrackType.CdMode2Form2; break; } UpdateStatus?.Invoke($"Track {tracks[t].TrackSequence} is MODE2 FORM 1"); - dumpLog.WriteLine("Track {0} is MODE2 FORM 1", tracks[t].TrackSequence); + _dumpLog.WriteLine("Track {0} is MODE2 FORM 1", tracks[t].TrackSequence); tracks[t].TrackType = TrackType.CdMode2Form1; // These media type specifications do not legally allow mode 2 tracks to be present @@ -936,18 +933,18 @@ namespace DiscImageChef.Core.Devices.Dumping break; default: UpdateStatus?.Invoke($"Track {tracks[t].TrackSequence} is unknown mode {cmdBuf[15]}"); - dumpLog.WriteLine("Track {0} is unknown mode {1}", tracks[t].TrackSequence, cmdBuf[15]); + _dumpLog.WriteLine("Track {0} is unknown mode {1}", tracks[t].TrackSequence, cmdBuf[15]); break; } } - if(outputPlugin.Id == new Guid("12345678-AAAA-BBBB-CCCC-123456789000")) + if(_outputPlugin.Id == new Guid("12345678-AAAA-BBBB-CCCC-123456789000")) { if(tracks.Length > 1) { StoppingErrorMessage?.Invoke("Output format does not support more than 1 track, not continuing..."); - dumpLog.WriteLine("Output format does not support more than 1 track, not continuing..."); + _dumpLog.WriteLine("Output format does not support more than 1 track, not continuing..."); return; } @@ -955,7 +952,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(tracks.Any(t => t.TrackType == TrackType.Audio)) { StoppingErrorMessage?.Invoke("Output format does not support audio tracks, not continuing..."); - dumpLog.WriteLine("Output format does not support audio tracks, not continuing..."); + _dumpLog.WriteLine("Output format does not support audio tracks, not continuing..."); return; } @@ -963,7 +960,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(tracks.Any(t => t.TrackType != TrackType.CdMode1)) { StoppingErrorMessage?.Invoke("Output format only supports MODE 1 tracks, not continuing..."); - dumpLog.WriteLine("Output format only supports MODE 1 tracks, not continuing..."); + _dumpLog.WriteLine("Output format only supports MODE 1 tracks, not continuing..."); return; } @@ -972,14 +969,14 @@ namespace DiscImageChef.Core.Devices.Dumping } // Check if something prevents from dumping the first track pregap - if(dumpFirstTrackPregap && readcd) + if(_dumpFirstTrackPregap && readcd) { - if(dev.PlatformId == PlatformID.FreeBSD && - !dev.IsRemote) + if(_dev.PlatformId == PlatformID.FreeBSD && + !_dev.IsRemote) { - if(force) + if(_force) { - dumpLog. + _dumpLog. WriteLine("FreeBSD panics when reading CD first track pregap, see upstream bug #224253. continuing"); ErrorMessage?. @@ -987,7 +984,7 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - dumpLog. + _dumpLog. WriteLine("FreeBSD panics when reading CD first track pregap, see upstream bug #224253. Not continuing"); StoppingErrorMessage?. @@ -996,19 +993,19 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - dumpFirstTrackPregap = false; + _dumpFirstTrackPregap = false; } - if(!outputPlugin.SupportedMediaTags.Contains(MediaTagType.CD_FirstTrackPregap)) + if(!_outputPlugin.SupportedMediaTags.Contains(MediaTagType.CD_FirstTrackPregap)) { - if(force) + if(_force) { - dumpLog.WriteLine("Output format does not support CD first track pregap, continuing..."); + _dumpLog.WriteLine("Output format does not support CD first track pregap, continuing..."); ErrorMessage?.Invoke("Output format does not support CD first track pregap, continuing..."); } else { - dumpLog.WriteLine("Output format does not support CD first track pregap, not continuing..."); + _dumpLog.WriteLine("Output format does not support CD first track pregap, not continuing..."); StoppingErrorMessage?. Invoke("Output format does not support CD first track pregap, not continuing..."); @@ -1016,12 +1013,12 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - dumpFirstTrackPregap = false; + _dumpFirstTrackPregap = false; } } // Try to read the first track pregap - if(dumpFirstTrackPregap && readcd) + if(_dumpFirstTrackPregap && readcd) { bool gotFirstTrackPregap = false; int firstTrackPregapSectorsGood = 0; @@ -1029,17 +1026,17 @@ namespace DiscImageChef.Core.Devices.Dumping cmdBuf = null; - dumpLog.WriteLine("Reading first track pregap"); + _dumpLog.WriteLine("Reading first track pregap"); UpdateStatus?.Invoke("Reading first track pregap"); InitProgress?.Invoke(); timeSpeedStart = DateTime.UtcNow; - for(int firstTrackPregapBlock = -150; firstTrackPregapBlock < 0 && resume.NextBlock == 0; + for(int firstTrackPregapBlock = -150; firstTrackPregapBlock < 0 && _resume.NextBlock == 0; firstTrackPregapBlock++) { - if(aborted) + if(_aborted) { - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); UpdateStatus?.Invoke("Aborted!"); break; @@ -1048,12 +1045,12 @@ namespace DiscImageChef.Core.Devices.Dumping PulseProgress?. Invoke($"Trying to read first track pregap sector {firstTrackPregapBlock} ({currentSpeed:F3} MiB/sec.)"); - sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint)firstTrackPregapBlock, blockSize, 1, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, dev.Timeout, out cmdDuration); + sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)firstTrackPregapBlock, blockSize, 1, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, + true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); if(!sense && - !dev.Error) + !_dev.Error) { firstTrackPregapMs.Write(cmdBuf, 0, (int)blockSize); gotFirstTrackPregap = true; @@ -1084,7 +1081,7 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); UpdateStatus?.Invoke($"Got {firstTrackPregapSectorsGood} first track pregap sectors."); - dumpLog.WriteLine("Got {0} first track pregap sectors.", firstTrackPregapSectorsGood); + _dumpLog.WriteLine("Got {0} first track pregap sectors.", firstTrackPregapSectorsGood); firstTrackPregapMs.Close(); } @@ -1094,95 +1091,95 @@ namespace DiscImageChef.Core.Devices.Dumping { if(readcd) { - sense = dev.ReadCd(out cmdBuf, out senseBuf, 0, blockSize, blocksToRead, MmcSectorTypes.AllTypes, - false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, - supportedSubchannel, dev.Timeout, out _); + sense = _dev.ReadCd(out cmdBuf, out senseBuf, 0, blockSize, blocksToRead, MmcSectorTypes.AllTypes, + false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, _dev.Timeout, out _); - if(dev.Error || sense) + if(_dev.Error || sense) blocksToRead /= 2; } else if(read16) { - sense = dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, 0, blockSize, 0, blocksToRead, - false, dev.Timeout, out _); + sense = _dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, 0, blockSize, 0, blocksToRead, + false, _dev.Timeout, out _); - if(dev.Error || sense) + if(_dev.Error || sense) blocksToRead /= 2; } else if(read12) { - sense = dev.Read12(out cmdBuf, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, - blocksToRead, false, dev.Timeout, out _); + sense = _dev.Read12(out cmdBuf, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, + blocksToRead, false, _dev.Timeout, out _); - if(dev.Error || sense) + if(_dev.Error || sense) blocksToRead /= 2; } else if(read10) { - sense = dev.Read10(out cmdBuf, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, - (ushort)blocksToRead, dev.Timeout, out _); + sense = _dev.Read10(out cmdBuf, out senseBuf, 0, false, true, false, false, 0, blockSize, 0, + (ushort)blocksToRead, _dev.Timeout, out _); - if(dev.Error || sense) + if(_dev.Error || sense) blocksToRead /= 2; } else if(read6) { - sense = dev.Read6(out cmdBuf, out senseBuf, 0, blockSize, (byte)blocksToRead, dev.Timeout, out _); + sense = _dev.Read6(out cmdBuf, out senseBuf, 0, blockSize, (byte)blocksToRead, _dev.Timeout, out _); - if(dev.Error || sense) + if(_dev.Error || sense) blocksToRead /= 2; } - if(!dev.Error || + if(!_dev.Error || blocksToRead == 1) break; } - if(dev.Error || sense) + if(_dev.Error || sense) { - dumpLog.WriteLine("Device error {0} trying to guess ideal transfer length.", dev.LastError); - StoppingErrorMessage?.Invoke($"Device error {dev.LastError} trying to guess ideal transfer length."); + _dumpLog.WriteLine("Device error {0} trying to guess ideal transfer length.", _dev.LastError); + StoppingErrorMessage?.Invoke($"Device error {_dev.LastError} trying to guess ideal transfer length."); } - dumpLog.WriteLine("Reading {0} sectors at a time.", blocksToRead); - dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * blockSize); - dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); - dumpLog.WriteLine("Device reports {0} bytes per logical block.", blockSize); - dumpLog.WriteLine("SCSI device type: {0}.", dev.ScsiType); - dumpLog.WriteLine("Media identified as {0}.", dskType); + _dumpLog.WriteLine("Reading {0} sectors at a time.", blocksToRead); + _dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * blockSize); + _dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); + _dumpLog.WriteLine("Device reports {0} bytes per logical block.", blockSize); + _dumpLog.WriteLine("SCSI device type: {0}.", _dev.ScsiType); + _dumpLog.WriteLine("Media identified as {0}.", dskType); UpdateStatus?.Invoke($"Reading {blocksToRead} sectors at a time."); UpdateStatus?.Invoke($"Device reports {blocks} blocks ({blocks * blockSize} bytes)."); UpdateStatus?.Invoke($"Device can read {blocksToRead} blocks at a time."); UpdateStatus?.Invoke($"Device reports {blockSize} bytes per logical block."); - UpdateStatus?.Invoke($"SCSI device type: {dev.ScsiType}."); + UpdateStatus?.Invoke($"SCSI device type: {_dev.ScsiType}."); UpdateStatus?.Invoke($"Media identified as {dskType}."); - ret = outputPlugin.Create(outputPath, dskType, formatOptions, blocks, - supportsLongSectors ? blockSize : 2048); + ret = _outputPlugin.Create(_outputPath, dskType, _formatOptions, blocks, + supportsLongSectors ? blockSize : 2048); // Cannot create image if(!ret) { - dumpLog.WriteLine("Error creating output image, not continuing."); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Error creating output image, not continuing."); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error creating output image, not continuing." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); } // Send track list to output plugin. This may fail if subchannel is set but unsupported. - ret = (outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); + ret = (_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); if(!ret && supportedSubchannel == MmcSubchannel.None) { - dumpLog.WriteLine("Error sending tracks to output image, not continuing."); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Error sending tracks to output image, not continuing."); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error sending tracks to output image, not continuing." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -1190,33 +1187,33 @@ namespace DiscImageChef.Core.Devices.Dumping // If a subchannel is supported, check if output plugin allows us to write it. if(supportedSubchannel != MmcSubchannel.None) { - dev.ReadCd(out cmdBuf, out senseBuf, 0, blockSize, 1, MmcSectorTypes.AllTypes, false, false, true, - MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, supportedSubchannel, dev.Timeout, - out _); + _dev.ReadCd(out cmdBuf, out senseBuf, 0, blockSize, 1, MmcSectorTypes.AllTypes, false, false, true, + MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, supportedSubchannel, + _dev.Timeout, out _); tmpBuf = new byte[subSize]; Array.Copy(cmdBuf, sectorSize, tmpBuf, 0, subSize); - ret = outputPlugin.WriteSectorTag(tmpBuf, 0, SectorTagType.CdSectorSubchannel); + ret = _outputPlugin.WriteSectorTag(tmpBuf, 0, SectorTagType.CdSectorSubchannel); if(!ret) { - if(force) + if(_force) { - dumpLog.WriteLine("Error writing subchannel to output image, {0}continuing...", - force ? "" : "not "); + _dumpLog.WriteLine("Error writing subchannel to output image, {0}continuing...", + _force ? "" : "not "); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); ErrorMessage?.Invoke("Error writing subchannel to output image, continuing..." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); } else { StoppingErrorMessage?.Invoke("Error writing subchannel to output image, not continuing..." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -1228,16 +1225,16 @@ namespace DiscImageChef.Core.Devices.Dumping for(int t = 0; t < tracks.Length; t++) tracks[t].TrackSubchannelType = TrackSubchannelType.None; - ret = (outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); + ret = (_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); if(!ret) { - dumpLog.WriteLine("Error sending tracks to output image, not continuing."); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Error sending tracks to output image, not continuing."); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error sending tracks to output image, not continuing..." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -1252,53 +1249,53 @@ namespace DiscImageChef.Core.Devices.Dumping if(track.TrackSequence == 0) continue; - dumpLog.WriteLine("Setting flags for track {0}...", track.TrackSequence); + _dumpLog.WriteLine("Setting flags for track {0}...", track.TrackSequence); UpdateStatus?.Invoke($"Setting flags for track {track.TrackSequence}..."); - outputPlugin.WriteSectorTag(new[] + _outputPlugin.WriteSectorTag(new[] { kvp.Value }, track.TrackStartSector, SectorTagType.CdTrackFlags); } // Set MCN - sense = dev.ReadMcn(out string mcn, out _, out _, dev.Timeout, out _); + sense = _dev.ReadMcn(out string mcn, out _, out _, _dev.Timeout, out _); if(!sense && mcn != null && mcn != "0000000000000" && - outputPlugin.WriteMediaTag(Encoding.ASCII.GetBytes(mcn), MediaTagType.CD_MCN)) + _outputPlugin.WriteMediaTag(Encoding.ASCII.GetBytes(mcn), MediaTagType.CD_MCN)) { UpdateStatus?.Invoke($"Setting disc Media Catalogue Number to {mcn}"); - dumpLog.WriteLine("Setting disc Media Catalogue Number to {0}", mcn); + _dumpLog.WriteLine("Setting disc Media Catalogue Number to {0}", mcn); } // Set ISRCs foreach(Track trk in tracks) { - sense = dev.ReadIsrc((byte)trk.TrackSequence, out string isrc, out _, out _, dev.Timeout, out _); + sense = _dev.ReadIsrc((byte)trk.TrackSequence, out string isrc, out _, out _, _dev.Timeout, out _); if(sense || isrc == null || isrc == "000000000000") continue; - if(!outputPlugin.WriteSectorTag(Encoding.ASCII.GetBytes(isrc), trk.TrackStartSector, - SectorTagType.CdTrackIsrc)) + if(!_outputPlugin.WriteSectorTag(Encoding.ASCII.GetBytes(isrc), trk.TrackStartSector, + SectorTagType.CdTrackIsrc)) continue; UpdateStatus?.Invoke($"Setting ISRC for track {trk.TrackSequence} to {isrc}"); - dumpLog.WriteLine("Setting ISRC for track {0} to {1}", trk.TrackSequence, isrc); + _dumpLog.WriteLine("Setting ISRC for track {0} to {1}", trk.TrackSequence, isrc); } - if(resume.NextBlock > 0) + if(_resume.NextBlock > 0) { - UpdateStatus?.Invoke($"Resuming from block {resume.NextBlock}."); - dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock); + UpdateStatus?.Invoke($"Resuming from block {_resume.NextBlock}."); + _dumpLog.WriteLine("Resuming from block {0}.", _resume.NextBlock); } - if(skip < blocksToRead) - skip = blocksToRead; + if(_skip < blocksToRead) + _skip = blocksToRead; #if DEBUG foreach(Track trk in tracks) @@ -1308,14 +1305,14 @@ namespace DiscImageChef.Core.Devices.Dumping if(dskType == MediaType.CDIREADY) { - dumpLog.WriteLine("There will be thousand of errors between track 0 and track 1, that is normal and you can ignore them."); + _dumpLog.WriteLine("There will be thousand of errors between track 0 and track 1, that is normal and you can ignore them."); UpdateStatus?. Invoke("There will be thousand of errors between track 0 and track 1, that is normal and you can ignore them."); } - mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead); - ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0008); + mhddLog = new MhddLog(_outputPrefix + ".mhddlog.bin", _dev, blocks, blockSize, blocksToRead); + ibgLog = new IbgLog(_outputPrefix + ".ibg", 0x0008); // Start reading start = DateTime.UtcNow; @@ -1324,13 +1321,13 @@ namespace DiscImageChef.Core.Devices.Dumping timeSpeedStart = DateTime.UtcNow; InitProgress?.Invoke(); - for(long i = (long)resume.NextBlock; i <= lastSector; i += blocksToRead) + for(long i = (long)_resume.NextBlock; i <= lastSector; i += blocksToRead) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -1358,35 +1355,35 @@ namespace DiscImageChef.Core.Devices.Dumping if(readcd) { - sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, blockSize, blocksToRead, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, dev.Timeout, out cmdDuration); + sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, blockSize, blocksToRead, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, + true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); totalDuration += cmdDuration; } else if(read16) { - sense = dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, ui, blockSize, 0, blocksToRead, - false, dev.Timeout, out cmdDuration); + sense = _dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, ui, blockSize, 0, blocksToRead, + false, _dev.Timeout, out cmdDuration); } else if(read12) { - sense = dev.Read12(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)i, blockSize, 0, - blocksToRead, false, dev.Timeout, out cmdDuration); + sense = _dev.Read12(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)i, blockSize, 0, + blocksToRead, false, _dev.Timeout, out cmdDuration); } else if(read10) { - sense = dev.Read10(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)i, blockSize, 0, - (ushort)blocksToRead, dev.Timeout, out cmdDuration); + sense = _dev.Read10(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)i, blockSize, 0, + (ushort)blocksToRead, _dev.Timeout, out cmdDuration); } else if(read6) { - sense = dev.Read6(out cmdBuf, out senseBuf, (uint)i, blockSize, (byte)blocksToRead, dev.Timeout, - out cmdDuration); + sense = _dev.Read6(out cmdBuf, out senseBuf, (uint)i, blockSize, (byte)blocksToRead, _dev.Timeout, + out cmdDuration); } if(!sense && - !dev.Error) + !_dev.Error) { mhddLog.Write(ui, cmdDuration); ibgLog.Write(ui, currentSpeed * 1024); @@ -1405,14 +1402,14 @@ namespace DiscImageChef.Core.Devices.Dumping Array.Copy(cmdBuf, (int)(sectorSize + (b * blockSize)), sub, subSize * b, subSize); } - outputPlugin.WriteSectorsLong(data, ui, blocksToRead); - outputPlugin.WriteSectorsTag(sub, ui, blocksToRead, SectorTagType.CdSectorSubchannel); + _outputPlugin.WriteSectorsLong(data, ui, blocksToRead); + _outputPlugin.WriteSectorsTag(sub, ui, blocksToRead, SectorTagType.CdSectorSubchannel); } else { if(supportsLongSectors) { - outputPlugin.WriteSectorsLong(cmdBuf, ui, blocksToRead); + _outputPlugin.WriteSectorsLong(cmdBuf, ui, blocksToRead); } else { @@ -1423,11 +1420,11 @@ namespace DiscImageChef.Core.Devices.Dumping for(int b = 0; b < blocksToRead; b++) Array.Copy(cmdBuf, (int)(16 + (b * blockSize)), data, 2048 * b, 2048); - outputPlugin.WriteSectors(data, ui, blocksToRead); + _outputPlugin.WriteSectors(data, ui, blocksToRead); } else { - outputPlugin.WriteSectorsLong(cmdBuf, ui, blocksToRead); + _outputPlugin.WriteSectorsLong(cmdBuf, ui, blocksToRead); } } } @@ -1437,54 +1434,54 @@ namespace DiscImageChef.Core.Devices.Dumping else { // TODO: Reset device after X errors - if(stopOnError) + if(_stopOnError) return; // TODO: Return more cleanly - if(ui + skip > blocks) - skip = (uint)(blocks - ui); + if(ui + _skip > blocks) + _skip = (uint)(blocks - ui); // Write empty data DateTime writeStart = DateTime.Now; if(supportedSubchannel != MmcSubchannel.None) { - outputPlugin.WriteSectorsLong(new byte[sectorSize * skip], ui, skip); + _outputPlugin.WriteSectorsLong(new byte[sectorSize * _skip], ui, _skip); - outputPlugin.WriteSectorsTag(new byte[subSize * skip], ui, skip, - SectorTagType.CdSectorSubchannel); + _outputPlugin.WriteSectorsTag(new byte[subSize * _skip], ui, _skip, + SectorTagType.CdSectorSubchannel); } else { if(supportsLongSectors) { - outputPlugin.WriteSectorsLong(new byte[blockSize * skip], ui, skip); + _outputPlugin.WriteSectorsLong(new byte[blockSize * _skip], ui, _skip); } else { if(cmdBuf.Length % 2352 == 0) - outputPlugin.WriteSectors(new byte[2048 * skip], ui, skip); + _outputPlugin.WriteSectors(new byte[2048 * _skip], ui, _skip); else - outputPlugin.WriteSectorsLong(new byte[blockSize * skip], ui, skip); + _outputPlugin.WriteSectorsLong(new byte[blockSize * _skip], ui, _skip); } } imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; - for(ulong b = ui; b < ui + skip; b++) - resume.BadBlocks.Add(b); + for(ulong b = ui; b < ui + _skip; b++) + _resume.BadBlocks.Add(b); DicConsole.DebugWriteLine("Dump-Media", "READ error:\n{0}", Sense.PrettifySense(senseBuf)); mhddLog.Write(ui, cmdDuration < 500 ? 65535 : cmdDuration); ibgLog.Write(ui, 0); - dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", skip, i); - i += skip - blocksToRead; + _dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", _skip, i); + i += _skip - blocksToRead; newTrim = true; } sectorSpeedStart += blocksToRead; - resume.NextBlock = ui + blocksToRead; + _resume.NextBlock = ui + blocksToRead; double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; @@ -1608,9 +1605,9 @@ namespace DiscImageChef.Core.Devices.Dumping end = DateTime.UtcNow; mhddLog.Close(); - ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, - (blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000), - devicePath); + ibgLog.Close(_dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, + (blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000), + _devicePath); UpdateStatus?.Invoke($"Dump finished in {(end - start).TotalSeconds} seconds."); @@ -1620,34 +1617,34 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?. Invoke($"Average write speed {((double)blockSize * (double)(blocks + 1)) / 1024 / imageWriteDuration:F3} KiB/sec."); - dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); - dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", - ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000)); + _dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000)); - dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", - ((double)blockSize * (double)(blocks + 1)) / 1024 / imageWriteDuration); + _dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / imageWriteDuration); #region Compact Disc Error trimming - if(resume.BadBlocks.Count > 0 && - !aborted && - !notrim && + if(_resume.BadBlocks.Count > 0 && + !_aborted && + !_notrim && newTrim) { start = DateTime.UtcNow; UpdateStatus?.Invoke("Trimming bad sectors"); - dumpLog.WriteLine("Trimming bad sectors"); + _dumpLog.WriteLine("Trimming bad sectors"); - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); InitProgress?.Invoke(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -1655,31 +1652,32 @@ namespace DiscImageChef.Core.Devices.Dumping PulseProgress?.Invoke($"Trimming sector {badSector}"); if(readcd) - sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint)badSector, blockSize, 1, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, dev.Timeout, out cmdDuration); + sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)badSector, blockSize, 1, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, + true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, + out cmdDuration); else if(read16) - sense = dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, badSector, blockSize, 0, - blocksToRead, false, dev.Timeout, out cmdDuration); + sense = _dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, badSector, blockSize, 0, + blocksToRead, false, _dev.Timeout, out cmdDuration); else if(read12) - sense = dev.Read12(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)badSector, - blockSize, 0, blocksToRead, false, dev.Timeout, out cmdDuration); + sense = _dev.Read12(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)badSector, + blockSize, 0, blocksToRead, false, _dev.Timeout, out cmdDuration); else if(read10) - sense = dev.Read10(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)badSector, - blockSize, 0, (ushort)blocksToRead, dev.Timeout, out cmdDuration); + sense = _dev.Read10(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)badSector, + blockSize, 0, (ushort)blocksToRead, _dev.Timeout, out cmdDuration); else if(read6) - sense = dev.Read6(out cmdBuf, out senseBuf, (uint)badSector, blockSize, (byte)blocksToRead, - dev.Timeout, out cmdDuration); + sense = _dev.Read6(out cmdBuf, out senseBuf, (uint)badSector, blockSize, (byte)blocksToRead, + _dev.Timeout, out cmdDuration); totalDuration += cmdDuration; - if(sense || dev.Error) + if(sense || _dev.Error) continue; if(!sense && - !dev.Error) + !_dev.Error) { - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); } @@ -1689,14 +1687,14 @@ namespace DiscImageChef.Core.Devices.Dumping byte[] sub = new byte[subSize]; Array.Copy(cmdBuf, 0, data, 0, sectorSize); Array.Copy(cmdBuf, sectorSize, sub, 0, subSize); - outputPlugin.WriteSectorLong(data, badSector); - outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); + _outputPlugin.WriteSectorLong(data, badSector); + _outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); } else { if(supportsLongSectors) { - outputPlugin.WriteSectorLong(cmdBuf, badSector); + _outputPlugin.WriteSectorLong(cmdBuf, badSector); } else { @@ -1707,11 +1705,11 @@ namespace DiscImageChef.Core.Devices.Dumping for(int b = 0; b < blocksToRead; b++) Array.Copy(cmdBuf, 16, data, 0, 2048); - outputPlugin.WriteSector(data, badSector); + _outputPlugin.WriteSector(data, badSector); } else { - outputPlugin.WriteSectorLong(cmdBuf, badSector); + _outputPlugin.WriteSectorLong(cmdBuf, badSector); } } } @@ -1720,14 +1718,14 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); end = DateTime.UtcNow; UpdateStatus?.Invoke($"Trimming finished in {(end - start).TotalSeconds} seconds."); - dumpLog.WriteLine("Trimming finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Trimming finished in {0} seconds.", (end - start).TotalSeconds); } #endregion Compact Disc Error trimming #region Compact Disc Error handling - if(resume.BadBlocks.Count > 0 && - !aborted && - retryPasses > 0) + if(_resume.BadBlocks.Count > 0 && + !_aborted && + _retryPasses > 0) { int pass = 1; bool forward = true; @@ -1737,17 +1735,17 @@ namespace DiscImageChef.Core.Devices.Dumping byte[] md6; byte[] md10; - if(persistent) + if(_persistent) { Modes.ModePage_01_MMC pgMmc; - sense = dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x01, - dev.Timeout, out _); + sense = _dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x01, + _dev.Timeout, out _); if(sense) { - sense = dev.ModeSense10(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x01, - dev.Timeout, out _); + sense = _dev.ModeSense10(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x01, + _dev.Timeout, out _); if(!sense) { @@ -1801,15 +1799,15 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); - md10 = Modes.EncodeMode10(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); + md10 = Modes.EncodeMode10(md, _dev.ScsiType); UpdateStatus?.Invoke("Sending MODE SELECT to drive (return damaged blocks)."); - dumpLog.WriteLine("Sending MODE SELECT to drive (return damaged blocks)."); - sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _); + _dumpLog.WriteLine("Sending MODE SELECT to drive (return damaged blocks)."); + sense = _dev.ModeSelect(md6, out senseBuf, true, false, _dev.Timeout, out _); if(sense) - sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); + sense = _dev.ModeSelect10(md10, out senseBuf, true, false, _dev.Timeout, out _); if(sense) { @@ -1818,7 +1816,7 @@ namespace DiscImageChef.Core.Devices.Dumping DicConsole.DebugWriteLine("Error: {0}", Sense.PrettifySense(senseBuf)); - dumpLog. + _dumpLog. WriteLine("Drive did not accept MODE SELECT command for persistent error reading, try another drive."); } else @@ -1829,15 +1827,15 @@ namespace DiscImageChef.Core.Devices.Dumping InitProgress?.Invoke(); cdRepeatRetry: - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); List sectorsNotEvenPartial = new List(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -1848,14 +1846,15 @@ namespace DiscImageChef.Core.Devices.Dumping if(readcd) { - sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint)badSector, blockSize, 1, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, dev.Timeout, out cmdDuration); + sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)badSector, blockSize, 1, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, + true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, + out cmdDuration); totalDuration += cmdDuration; } - if(sense || dev.Error) + if(sense || _dev.Error) { if(!runningPersistent) continue; @@ -1870,12 +1869,12 @@ namespace DiscImageChef.Core.Devices.Dumping } if(!sense && - !dev.Error) + !_dev.Error) { - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); UpdateStatus?.Invoke($"Correctly retried sector {badSector} in pass {pass}."); - dumpLog.WriteLine("Correctly retried sector {0} in pass {1}.", badSector, pass); + _dumpLog.WriteLine("Correctly retried sector {0} in pass {1}.", badSector, pass); sectorsNotEvenPartial.Remove(badSector); } @@ -1885,23 +1884,23 @@ namespace DiscImageChef.Core.Devices.Dumping byte[] sub = new byte[subSize]; Array.Copy(cmdBuf, 0, data, 0, sectorSize); Array.Copy(cmdBuf, sectorSize, sub, 0, subSize); - outputPlugin.WriteSectorLong(data, badSector); - outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); + _outputPlugin.WriteSectorLong(data, badSector); + _outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); } else { - outputPlugin.WriteSectorLong(cmdBuf, badSector); + _outputPlugin.WriteSectorLong(cmdBuf, badSector); } } - if(pass < retryPasses && - !aborted && - resume.BadBlocks.Count > 0) + if(pass < _retryPasses && + !_aborted && + _resume.BadBlocks.Count > 0) { pass++; forward = !forward; - resume.BadBlocks.Sort(); - resume.BadBlocks.Reverse(); + _resume.BadBlocks.Sort(); + _resume.BadBlocks.Reverse(); goto cdRepeatRetry; } @@ -1909,7 +1908,7 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); // Try to ignore read errors, on some drives this allows to recover partial even if damaged data - if(persistent && sectorsNotEvenPartial.Count > 0) + if(_persistent && sectorsNotEvenPartial.Count > 0) { var pgMmc = new Modes.ModePage_01_MMC { @@ -1927,14 +1926,14 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); - md10 = Modes.EncodeMode10(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); + md10 = Modes.EncodeMode10(md, _dev.ScsiType); - dumpLog.WriteLine("Sending MODE SELECT to drive (ignore error correction)."); - sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _); + _dumpLog.WriteLine("Sending MODE SELECT to drive (ignore error correction)."); + sense = _dev.ModeSelect(md6, out senseBuf, true, false, _dev.Timeout, out _); if(sense) - sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); + sense = _dev.ModeSelect10(md10, out senseBuf, true, false, _dev.Timeout, out _); if(!sense) { @@ -1944,10 +1943,10 @@ namespace DiscImageChef.Core.Devices.Dumping foreach(ulong badSector in sectorsNotEvenPartial) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -1956,18 +1955,18 @@ namespace DiscImageChef.Core.Devices.Dumping if(readcd) { - sense = dev.ReadCd(out cmdBuf, out senseBuf, (uint)badSector, blockSize, 1, - MmcSectorTypes.AllTypes, false, false, true, - MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, - supportedSubchannel, dev.Timeout, out cmdDuration); + sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)badSector, blockSize, 1, + MmcSectorTypes.AllTypes, false, false, true, + MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, _dev.Timeout, out cmdDuration); totalDuration += cmdDuration; } - if(sense || dev.Error) + if(sense || _dev.Error) continue; - dumpLog.WriteLine("Got partial data for sector {0} in pass {1}.", badSector, pass); + _dumpLog.WriteLine("Got partial data for sector {0} in pass {1}.", badSector, pass); if(supportedSubchannel != MmcSubchannel.None) { @@ -1975,12 +1974,12 @@ namespace DiscImageChef.Core.Devices.Dumping byte[] sub = new byte[subSize]; Array.Copy(cmdBuf, 0, data, 0, sectorSize); Array.Copy(cmdBuf, sectorSize, sub, 0, subSize); - outputPlugin.WriteSectorLong(data, badSector); - outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); + _outputPlugin.WriteSectorLong(data, badSector); + _outputPlugin.WriteSectorTag(sub, badSector, SectorTagType.CdSectorSubchannel); } else { - outputPlugin.WriteSectorLong(cmdBuf, badSector); + _outputPlugin.WriteSectorLong(cmdBuf, badSector); } } @@ -2102,14 +2101,14 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); - md10 = Modes.EncodeMode10(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); + md10 = Modes.EncodeMode10(md, _dev.ScsiType); - dumpLog.WriteLine("Sending MODE SELECT to drive (return device to previous status)."); - sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _); + _dumpLog.WriteLine("Sending MODE SELECT to drive (return device to previous status)."); + sense = _dev.ModeSelect(md6, out senseBuf, true, false, _dev.Timeout, out _); if(sense) - dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); + _dev.ModeSelect10(md10, out senseBuf, true, false, _dev.Timeout, out _); } EndProgress?.Invoke(); @@ -2117,7 +2116,7 @@ namespace DiscImageChef.Core.Devices.Dumping #endregion Compact Disc Error handling // Write media tags to image - if(!aborted) + if(!_aborted) foreach(KeyValuePair tag in mediaTags) { if(tag.Value is null) @@ -2127,51 +2126,51 @@ namespace DiscImageChef.Core.Devices.Dumping continue; } - ret = outputPlugin.WriteMediaTag(tag.Value, tag.Key); + ret = _outputPlugin.WriteMediaTag(tag.Value, tag.Key); - if(ret || force) + if(ret || _force) continue; // Cannot write tag to image - dumpLog.WriteLine($"Cannot write tag {tag.Key}."); - StoppingErrorMessage?.Invoke(outputPlugin.ErrorMessage); + _dumpLog.WriteLine($"Cannot write tag {tag.Key}."); + StoppingErrorMessage?.Invoke(_outputPlugin.ErrorMessage); return; } - resume.BadBlocks.Sort(); + _resume.BadBlocks.Sort(); - foreach(ulong bad in resume.BadBlocks) - dumpLog.WriteLine("Sector {0} could not be read.", bad); + foreach(ulong bad in _resume.BadBlocks) + _dumpLog.WriteLine("Sector {0} could not be read.", bad); currentTry.Extents = ExtentsConverter.ToMetadata(extents); - outputPlugin.SetDumpHardware(resume.Tries); + _outputPlugin.SetDumpHardware(_resume.Tries); - if(preSidecar != null) - outputPlugin.SetCicmMetadata(preSidecar); + if(_preSidecar != null) + _outputPlugin.SetCicmMetadata(_preSidecar); - dumpLog.WriteLine("Closing output file."); + _dumpLog.WriteLine("Closing output file."); UpdateStatus?.Invoke("Closing output file."); DateTime closeStart = DateTime.Now; - outputPlugin.Close(); + _outputPlugin.Close(); DateTime closeEnd = DateTime.Now; UpdateStatus?.Invoke($"Closed in {(closeEnd - closeStart).TotalSeconds} seconds."); - if(aborted) + if(_aborted) { - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); return; } double totalChkDuration = 0; - if(!nometadata) + if(!_nometadata) { - dumpLog.WriteLine("Creating sidecar."); + _dumpLog.WriteLine("Creating sidecar."); var filters = new FiltersList(); - IFilter filter = filters.GetFilter(outputPath); + IFilter filter = filters.GetFilter(_outputPath); IMediaImage inputPlugin = ImageFormat.Detect(filter); if(!inputPlugin.Open(filter)) @@ -2184,27 +2183,27 @@ namespace DiscImageChef.Core.Devices.Dumping DateTime chkStart = DateTime.UtcNow; // ReSharper disable once UseObjectOrCollectionInitializer - sidecarClass = new Sidecar(inputPlugin, outputPath, filter.Id, encoding); - sidecarClass.InitProgressEvent += InitProgress; - sidecarClass.UpdateProgressEvent += UpdateProgress; - sidecarClass.EndProgressEvent += EndProgress; - sidecarClass.InitProgressEvent2 += InitProgress2; - sidecarClass.UpdateProgressEvent2 += UpdateProgress2; - sidecarClass.EndProgressEvent2 += EndProgress2; - sidecarClass.UpdateStatusEvent += UpdateStatus; - CICMMetadataType sidecar = sidecarClass.Create(); + _sidecarClass = new Sidecar(inputPlugin, _outputPath, filter.Id, _encoding); + _sidecarClass.InitProgressEvent += InitProgress; + _sidecarClass.UpdateProgressEvent += UpdateProgress; + _sidecarClass.EndProgressEvent += EndProgress; + _sidecarClass.InitProgressEvent2 += InitProgress2; + _sidecarClass.UpdateProgressEvent2 += UpdateProgress2; + _sidecarClass.EndProgressEvent2 += EndProgress2; + _sidecarClass.UpdateStatusEvent += UpdateStatus; + CICMMetadataType sidecar = _sidecarClass.Create(); end = DateTime.UtcNow; totalChkDuration = (end - chkStart).TotalMilliseconds; - dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); + _dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); - dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", - ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000)); + _dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000)); - if(preSidecar != null) + if(_preSidecar != null) { - preSidecar.OpticalDisc = sidecar.OpticalDisc; - sidecar = preSidecar; + _preSidecar.OpticalDisc = sidecar.OpticalDisc; + sidecar = _preSidecar; } List<(ulong start, string type)> filesystems = new List<(ulong start, string type)>(); @@ -2221,21 +2220,21 @@ namespace DiscImageChef.Core.Devices.Dumping { o.start, o.type }).Distinct()) - dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); + _dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); sidecar.OpticalDisc[0].Dimensions = Dimensions.DimensionsFromMediaType(dskType); (string type, string subType) discType = CommonTypes.Metadata.MediaType.MediaTypeToString(dskType); sidecar.OpticalDisc[0].DiscType = discType.type; sidecar.OpticalDisc[0].DiscSubType = discType.subType; - sidecar.OpticalDisc[0].DumpHardwareArray = resume.Tries.ToArray(); + sidecar.OpticalDisc[0].DumpHardwareArray = _resume.Tries.ToArray(); foreach(KeyValuePair tag in mediaTags) - if(outputPlugin.SupportedMediaTags.Contains(tag.Key)) - AddMediaTagToSidecar(outputPath, tag, ref sidecar); + if(_outputPlugin.SupportedMediaTags.Contains(tag.Key)) + AddMediaTagToSidecar(_outputPath, tag, ref sidecar); UpdateStatus?.Invoke("Writing metadata sidecar"); - var xmlFs = new FileStream(outputPrefix + ".cicm.xml", FileMode.Create); + var xmlFs = new FileStream(_outputPrefix + ".cicm.xml", FileMode.Create); var xmlSer = new XmlSerializer(typeof(CICMMetadataType)); xmlSer.Serialize(xmlFs, sidecar); @@ -2253,7 +2252,7 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke($"Fastest speed burst: {maxSpeed:F3} MiB/sec."); UpdateStatus?.Invoke($"Slowest speed burst: {minSpeed:F3} MiB/sec."); - UpdateStatus?.Invoke($"{resume.BadBlocks.Count} sectors could not be read."); + UpdateStatus?.Invoke($"{_resume.BadBlocks.Count} sectors could not be read."); UpdateStatus?.Invoke(""); Statistics.AddMedia(dskType, true); diff --git a/DiscImageChef.Core/Devices/Dumping/Dump.cs b/DiscImageChef.Core/Devices/Dumping/Dump.cs index 97c7d961c..3531e8801 100644 --- a/DiscImageChef.Core/Devices/Dumping/Dump.cs +++ b/DiscImageChef.Core/Devices/Dumping/Dump.cs @@ -14,32 +14,30 @@ namespace DiscImageChef.Core.Devices.Dumping { public partial class Dump { - readonly Device dev; - readonly string devicePath; - readonly bool doResume; - readonly DumpLog dumpLog; - readonly bool dumpRaw; - readonly Encoding encoding; - readonly bool force; - readonly Dictionary formatOptions; - readonly bool nometadata; - readonly bool notrim; - readonly string outputPath; - readonly IWritableImage outputPlugin; - readonly string outputPrefix; - readonly bool persistent; - readonly CICMMetadataType preSidecar; - readonly ushort retryPasses; - readonly bool stopOnError; - bool aborted; - bool dumpFirstTrackPregap; - Resume resume; - Sidecar sidecarClass; - uint skip; + readonly Device _dev; + readonly string _devicePath; + readonly bool _doResume; + readonly DumpLog _dumpLog; + readonly bool _dumpRaw; + readonly Encoding _encoding; + readonly bool _force; + readonly Dictionary _formatOptions; + readonly bool _nometadata; + readonly bool _notrim; + readonly string _outputPath; + readonly IWritableImage _outputPlugin; + readonly string _outputPrefix; + readonly bool _persistent; + readonly CICMMetadataType _preSidecar; + readonly ushort _retryPasses; + readonly bool _stopOnError; + bool _aborted; + bool _dumpFirstTrackPregap; + Resume _resume; + Sidecar _sidecarClass; + uint _skip; - /// - /// Initializes dumpers - /// + /// Initializes dumpers /// Should resume? /// Device /// Path to the device @@ -60,130 +58,113 @@ namespace DiscImageChef.Core.Devices.Dumping /// Sidecar to store in dumped image /// How many sectors to skip reading on error /// Create metadata sidecar after dump? - public Dump(bool doResume, Device dev, string devicePath, - IWritableImage outputPlugin, ushort retryPasses, - bool force, bool dumpRaw, bool persistent, - bool stopOnError, Resume resume, DumpLog dumpLog, - Encoding encoding, string outputPrefix, string outputPath, - Dictionary formatOptions, - CICMMetadataType preSidecar, uint skip, bool nometadata, - bool notrim, bool dumpFirstTrackPregap) + public Dump(bool doResume, Device dev, string devicePath, IWritableImage outputPlugin, ushort retryPasses, + bool force, bool dumpRaw, bool persistent, bool stopOnError, Resume resume, DumpLog dumpLog, + Encoding encoding, string outputPrefix, string outputPath, Dictionary formatOptions, + CICMMetadataType preSidecar, uint skip, bool nometadata, bool notrim, bool dumpFirstTrackPregap) { - this.doResume = doResume; - this.dev = dev; - this.devicePath = devicePath; - this.outputPlugin = outputPlugin; - this.retryPasses = retryPasses; - this.force = force; - this.dumpRaw = dumpRaw; - this.persistent = persistent; - this.stopOnError = stopOnError; - this.resume = resume; - this.dumpLog = dumpLog; - this.encoding = encoding; - this.outputPrefix = outputPrefix; - this.outputPath = outputPath; - this.formatOptions = formatOptions; - this.preSidecar = preSidecar; - this.skip = skip; - this.nometadata = nometadata; - this.notrim = notrim; - this.dumpFirstTrackPregap = dumpFirstTrackPregap; - aborted = false; + _doResume = doResume; + _dev = dev; + _devicePath = devicePath; + _outputPlugin = outputPlugin; + _retryPasses = retryPasses; + _force = force; + _dumpRaw = dumpRaw; + _persistent = persistent; + _stopOnError = stopOnError; + _resume = resume; + _dumpLog = dumpLog; + _encoding = encoding; + _outputPrefix = outputPrefix; + _outputPath = outputPath; + _formatOptions = formatOptions; + _preSidecar = preSidecar; + _skip = skip; + _nometadata = nometadata; + _notrim = notrim; + _dumpFirstTrackPregap = dumpFirstTrackPregap; + _aborted = false; } - /// - /// Starts dumping with the stablished fields and autodetecting the device type - /// + /// Starts dumping with the stablished fields and autodetecting the device type public void Start() { - if(dev.IsUsb && dev.UsbVendorId == 0x054C && - (dev.UsbProductId == 0x01C8 || dev.UsbProductId == 0x01C9 || dev.UsbProductId == 0x02D2)) + if(_dev.IsUsb && + _dev.UsbVendorId == 0x054C && + (_dev.UsbProductId == 0x01C8 || _dev.UsbProductId == 0x01C9 || _dev.UsbProductId == 0x02D2)) PlayStationPortable(); else - switch(dev.Type) + switch(_dev.Type) { case DeviceType.ATA: Ata(); + break; case DeviceType.MMC: case DeviceType.SecureDigital: SecureDigital(); + break; case DeviceType.NVMe: NVMe(); + break; case DeviceType.ATAPI: case DeviceType.SCSI: Scsi(); + break; default: - dumpLog.WriteLine("Unknown device type."); - dumpLog.Close(); + _dumpLog.WriteLine("Unknown device type."); + _dumpLog.Close(); StoppingErrorMessage?.Invoke("Unknown device type."); + return; } - dumpLog.Close(); + _dumpLog.Close(); - if(resume == null || !doResume) return; + if(_resume == null || + !_doResume) + return; - resume.LastWriteDate = DateTime.UtcNow; - resume.BadBlocks.Sort(); + _resume.LastWriteDate = DateTime.UtcNow; + _resume.BadBlocks.Sort(); - if(File.Exists(outputPrefix + ".resume.xml")) File.Delete(outputPrefix + ".resume.xml"); + if(File.Exists(_outputPrefix + ".resume.xml")) + File.Delete(_outputPrefix + ".resume.xml"); - FileStream fs = new FileStream(outputPrefix + ".resume.xml", FileMode.Create, FileAccess.ReadWrite); - XmlSerializer xs = new XmlSerializer(resume.GetType()); - xs.Serialize(fs, resume); + var fs = new FileStream(_outputPrefix + ".resume.xml", FileMode.Create, FileAccess.ReadWrite); + var xs = new XmlSerializer(_resume.GetType()); + xs.Serialize(fs, _resume); fs.Close(); } public void Abort() { - aborted = true; - sidecarClass?.Abort(); + _aborted = true; + _sidecarClass?.Abort(); } - /// - /// Event raised when the progress bar is not longer needed - /// + /// Event raised when the progress bar is not longer needed public event EndProgressHandler EndProgress; - /// - /// Event raised when a progress bar is needed - /// + /// Event raised when a progress bar is needed public event InitProgressHandler InitProgress; - /// - /// Event raised to report status updates - /// + /// Event raised to report status updates public event UpdateStatusHandler UpdateStatus; - /// - /// Event raised to report a non-fatal error - /// + /// Event raised to report a non-fatal error public event ErrorMessageHandler ErrorMessage; - /// - /// Event raised to report a fatal error that stops the dumping operation and should call user's attention - /// + /// Event raised to report a fatal error that stops the dumping operation and should call user's attention public event ErrorMessageHandler StoppingErrorMessage; - /// - /// Event raised to update the values of a determinate progress bar - /// + /// Event raised to update the values of a determinate progress bar public event UpdateProgressHandler UpdateProgress; - /// - /// Event raised to update the status of an undeterminate progress bar - /// + /// Event raised to update the status of an undeterminate progress bar public event PulseProgressHandler PulseProgress; - /// - /// Event raised when the progress bar is not longer needed - /// + /// Event raised when the progress bar is not longer needed public event EndProgressHandler2 EndProgress2; - /// - /// Event raised when a progress bar is needed - /// + /// Event raised when a progress bar is needed public event InitProgressHandler2 InitProgress2; - /// - /// Event raised to update the values of a determinate progress bar - /// + /// Event raised to update the values of a determinate progress bar public event UpdateProgressHandler2 UpdateProgress2; } } \ No newline at end of file diff --git a/DiscImageChef.Core/Devices/Dumping/MMC.cs b/DiscImageChef.Core/Devices/Dumping/MMC.cs index fe1f49617..39dea3a0c 100644 --- a/DiscImageChef.Core/Devices/Dumping/MMC.cs +++ b/DiscImageChef.Core/Devices/Dumping/MMC.cs @@ -58,13 +58,13 @@ namespace DiscImageChef.Core.Devices.Dumping bool isXbox = false; // TODO: Log not only what is it reading, but if it was read correctly or not. - sense = dev.GetConfiguration(out byte[] cmdBuf, out _, 0, MmcGetConfigurationRt.Current, dev.Timeout, - out _); + sense = _dev.GetConfiguration(out byte[] cmdBuf, out _, 0, MmcGetConfigurationRt.Current, _dev.Timeout, + out _); if(!sense) { Features.SeparatedFeatures ftr = Features.Separate(cmdBuf); - dumpLog.WriteLine("Device reports current profile is 0x{0:X4}", ftr.CurrentProfile); + _dumpLog.WriteLine("Device reports current profile is 0x{0:X4}", ftr.CurrentProfile); switch(ftr.CurrentProfile) { @@ -176,9 +176,9 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - var scsiReader = new Reader(dev, dev.Timeout, null, dumpRaw); + var scsiReader = new Reader(_dev, _dev.Timeout, null, _dumpRaw); ulong blocks = scsiReader.GetDeviceBlocks(); - dumpLog.WriteLine("Device reports disc has {0} blocks", blocks); + _dumpLog.WriteLine("Device reports disc has {0} blocks", blocks); Dictionary mediaTags = new Dictionary(); if(dskType == MediaType.PD650) @@ -208,10 +208,10 @@ namespace DiscImageChef.Core.Devices.Dumping switch(dskType) { case MediaType.Unknown when blocks > 0: - dumpLog.WriteLine("Reading Physical Format Information"); + _dumpLog.WriteLine("Reading Physical Format Information"); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.PhysicalInformation, 0, _dev.Timeout, out _); if(!sense) { @@ -221,7 +221,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(nintendoPfi.Value.DiskCategory == DiskCategory.Nintendo && nintendoPfi.Value.PartVersion == 15) { - dumpLog.WriteLine("Dumping Nintendo GameCube or Wii discs is not yet implemented."); + _dumpLog.WriteLine("Dumping Nintendo GameCube or Wii discs is not yet implemented."); StoppingErrorMessage?. Invoke("Dumping Nintendo GameCube or Wii discs is not yet implemented."); @@ -248,10 +248,10 @@ namespace DiscImageChef.Core.Devices.Dumping case MediaType.HDDVDROM: case MediaType.HDDVDRW: case MediaType.HDDVDRWDL: - dumpLog.WriteLine("Reading Physical Format Information"); + _dumpLog.WriteLine("Reading Physical Format Information"); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.PhysicalInformation, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.PhysicalInformation, 0, _dev.Timeout, out _); if(!sense) if(PFI.Decode(cmdBuf).HasValue) @@ -326,11 +326,11 @@ namespace DiscImageChef.Core.Devices.Dumping } } - dumpLog.WriteLine("Reading Disc Manufacturing Information"); + _dumpLog.WriteLine("Reading Disc Manufacturing Information"); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.DiscManufacturingInformation, 0, dev.Timeout, - out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.DiscManufacturingInformation, 0, _dev.Timeout, + out _); if(!sense) { @@ -352,13 +352,13 @@ namespace DiscImageChef.Core.Devices.Dumping dskType = MediaType.XGD3; } - sense = dev.ScsiInquiry(out byte[] inqBuf, out _); + sense = _dev.ScsiInquiry(out byte[] inqBuf, out _); if(sense || !Inquiry.Decode(inqBuf).HasValue || (Inquiry.Decode(inqBuf).HasValue && !Inquiry.Decode(inqBuf).Value.KreonPresent)) { - dumpLog.WriteLine("Dumping Xbox Game Discs requires a drive with Kreon firmware."); + _dumpLog.WriteLine("Dumping Xbox Game Discs requires a drive with Kreon firmware."); StoppingErrorMessage?. Invoke("Dumping Xbox Game Discs requires a drive with Kreon firmware."); @@ -366,7 +366,7 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - if(dumpRaw && !force) + if(_dumpRaw && !_force) { StoppingErrorMessage?. Invoke("Not continuing. If you want to continue reading cooked data when raw is not available use the force option."); @@ -397,10 +397,10 @@ namespace DiscImageChef.Core.Devices.Dumping if(dskType == MediaType.DVDDownload || dskType == MediaType.DVDROM) { - dumpLog.WriteLine("Reading Lead-in Copyright Information."); + _dumpLog.WriteLine("Reading Lead-in Copyright Information."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.CopyrightInformation, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.CopyrightInformation, 0, _dev.Timeout, out _); if(!sense) if(CSS_CPRM.DecodeLeadInCopyright(cmdBuf).HasValue) @@ -418,10 +418,10 @@ namespace DiscImageChef.Core.Devices.Dumping case MediaType.DVDDownload: case MediaType.DVDROM: case MediaType.HDDVDROM: - dumpLog.WriteLine("Reading Burst Cutting Area."); + _dumpLog.WriteLine("Reading Burst Cutting Area."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.BurstCuttingArea, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.BurstCuttingArea, 0, _dev.Timeout, out _); if(!sense) { @@ -436,10 +436,10 @@ namespace DiscImageChef.Core.Devices.Dumping #region DVD-RAM and HD DVD-RAM case MediaType.DVDRAM: case MediaType.HDDVDRAM: - dumpLog.WriteLine("Reading Disc Description Structure."); + _dumpLog.WriteLine("Reading Disc Description Structure."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.DvdramDds, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.DvdramDds, 0, _dev.Timeout, out _); if(!sense) if(DDS.Decode(cmdBuf).HasValue) @@ -449,11 +449,11 @@ namespace DiscImageChef.Core.Devices.Dumping mediaTags.Add(MediaTagType.DVDRAM_DDS, tmpBuf); } - dumpLog.WriteLine("Reading Spare Area Information."); + _dumpLog.WriteLine("Reading Spare Area Information."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.DvdramSpareAreaInformation, 0, dev.Timeout, - out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.DvdramSpareAreaInformation, 0, _dev.Timeout, + out _); if(!sense) if(Spare.Decode(cmdBuf).HasValue) @@ -469,10 +469,10 @@ namespace DiscImageChef.Core.Devices.Dumping #region DVD-R and DVD-RW case MediaType.DVDR: case MediaType.DVDRW: - dumpLog.WriteLine("Reading Pre-Recorded Information."); + _dumpLog.WriteLine("Reading Pre-Recorded Information."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.PreRecordedInfo, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.PreRecordedInfo, 0, _dev.Timeout, out _); if(!sense) { @@ -491,10 +491,10 @@ namespace DiscImageChef.Core.Devices.Dumping case MediaType.DVDR: case MediaType.DVDRW: case MediaType.HDDVDR: - dumpLog.WriteLine("Reading Media Identifier."); + _dumpLog.WriteLine("Reading Media Identifier."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.DvdrMediaIdentifier, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.DvdrMediaIdentifier, 0, _dev.Timeout, out _); if(!sense) { @@ -503,11 +503,11 @@ namespace DiscImageChef.Core.Devices.Dumping mediaTags.Add(MediaTagType.DVDR_MediaIdentifier, tmpBuf); } - dumpLog.WriteLine("Reading Recordable Physical Information."); + _dumpLog.WriteLine("Reading Recordable Physical Information."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.DvdrPhysicalInformation, 0, dev.Timeout, - out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.DvdrPhysicalInformation, 0, _dev.Timeout, + out _); if(!sense) { @@ -524,10 +524,10 @@ namespace DiscImageChef.Core.Devices.Dumping case MediaType.DVDPRDL: case MediaType.DVDPRW: case MediaType.DVDPRWDL: - dumpLog.WriteLine("Reading ADdress In Pregroove."); + _dumpLog.WriteLine("Reading ADdress In Pregroove."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.Adip, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.Adip, 0, _dev.Timeout, out _); if(!sense) { @@ -536,10 +536,10 @@ namespace DiscImageChef.Core.Devices.Dumping mediaTags.Add(MediaTagType.DVD_ADIP, tmpBuf); } - dumpLog.WriteLine("Reading Disc Control Blocks."); + _dumpLog.WriteLine("Reading Disc Control Blocks."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.Dcb, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.Dcb, 0, _dev.Timeout, out _); if(!sense) { @@ -553,11 +553,11 @@ namespace DiscImageChef.Core.Devices.Dumping #region HD DVD-ROM case MediaType.HDDVDROM: - dumpLog.WriteLine("Reading Lead-in Copyright Information."); + _dumpLog.WriteLine("Reading Lead-in Copyright Information."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.HddvdCopyrightInformation, 0, dev.Timeout, - out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.HddvdCopyrightInformation, 0, _dev.Timeout, + out _); if(!sense) { @@ -575,10 +575,10 @@ namespace DiscImageChef.Core.Devices.Dumping case MediaType.BDROM: case MediaType.BDRXL: case MediaType.BDREXL: - dumpLog.WriteLine("Reading Disc Information."); + _dumpLog.WriteLine("Reading Disc Information."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0, - MmcDiscStructureFormat.DiscInformation, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0, + MmcDiscStructureFormat.DiscInformation, 0, _dev.Timeout, out _); if(!sense) if(DI.Decode(cmdBuf).HasValue) @@ -607,10 +607,10 @@ namespace DiscImageChef.Core.Devices.Dumping { #region BD-ROM only case MediaType.BDROM: - dumpLog.WriteLine("Reading Burst Cutting Area."); + _dumpLog.WriteLine("Reading Burst Cutting Area."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0, - MmcDiscStructureFormat.BdBurstCuttingArea, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0, + MmcDiscStructureFormat.BdBurstCuttingArea, 0, _dev.Timeout, out _); if(!sense) { @@ -627,10 +627,10 @@ namespace DiscImageChef.Core.Devices.Dumping case MediaType.BDRE: case MediaType.BDRXL: case MediaType.BDREXL: - dumpLog.WriteLine("Reading Disc Definition Structure."); + _dumpLog.WriteLine("Reading Disc Definition Structure."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0, - MmcDiscStructureFormat.BdDds, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0, + MmcDiscStructureFormat.BdDds, 0, _dev.Timeout, out _); if(!sense) { @@ -639,10 +639,11 @@ namespace DiscImageChef.Core.Devices.Dumping mediaTags.Add(MediaTagType.BD_DDS, tmpBuf); } - dumpLog.WriteLine("Reading Spare Area Information."); + _dumpLog.WriteLine("Reading Spare Area Information."); - sense = dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0, - MmcDiscStructureFormat.BdSpareAreaInformation, 0, dev.Timeout, out _); + sense = _dev.ReadDiscStructure(out cmdBuf, out _, MmcDiscStructureMediaType.Bd, 0, 0, + MmcDiscStructureFormat.BdSpareAreaInformation, 0, _dev.Timeout, + out _); if(!sense) { diff --git a/DiscImageChef.Core/Devices/Dumping/PlayStationPortable.cs b/DiscImageChef.Core/Devices/Dumping/PlayStationPortable.cs index 50d1a948f..c5801900d 100644 --- a/DiscImageChef.Core/Devices/Dumping/PlayStationPortable.cs +++ b/DiscImageChef.Core/Devices/Dumping/PlayStationPortable.cs @@ -35,11 +35,11 @@ namespace DiscImageChef.Core.Devices.Dumping /// Dumps a CFW PlayStation Portable UMD void PlayStationPortable() { - if(!outputPlugin.SupportedMediaTypes.Contains(MediaType.MemoryStickDuo) && - !outputPlugin.SupportedMediaTypes.Contains(MediaType.MemoryStickProDuo) && - !outputPlugin.SupportedMediaTypes.Contains(MediaType.UMD)) + if(!_outputPlugin.SupportedMediaTypes.Contains(MediaType.MemoryStickDuo) && + !_outputPlugin.SupportedMediaTypes.Contains(MediaType.MemoryStickProDuo) && + !_outputPlugin.SupportedMediaTypes.Contains(MediaType.UMD)) { - dumpLog.WriteLine("Selected output plugin does not support MemoryStick Duo or UMD, cannot dump..."); + _dumpLog.WriteLine("Selected output plugin does not support MemoryStick Duo or UMD, cannot dump..."); StoppingErrorMessage?. Invoke("Selected output plugin does not support MemoryStick Duo or UMD, cannot dump..."); @@ -48,14 +48,14 @@ namespace DiscImageChef.Core.Devices.Dumping } UpdateStatus?.Invoke("Checking if media is UMD or MemoryStick..."); - dumpLog.WriteLine("Checking if media is UMD or MemoryStick..."); + _dumpLog.WriteLine("Checking if media is UMD or MemoryStick..."); - bool sense = dev.ModeSense6(out byte[] buffer, out _, false, ScsiModeSensePageControl.Current, 0, - dev.Timeout, out _); + bool sense = _dev.ModeSense6(out byte[] buffer, out _, false, ScsiModeSensePageControl.Current, 0, + _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Could not get MODE SENSE..."); + _dumpLog.WriteLine("Could not get MODE SENSE..."); StoppingErrorMessage?.Invoke("Could not get MODE SENSE..."); return; @@ -65,7 +65,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(!decoded.HasValue) { - dumpLog.WriteLine("Could not decode MODE SENSE..."); + _dumpLog.WriteLine("Could not decode MODE SENSE..."); StoppingErrorMessage?.Invoke("Could not decode MODE SENSE..."); return; @@ -79,12 +79,12 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - sense = dev.Read12(out buffer, out _, 0, false, true, false, false, 0, 512, 0, 1, false, dev.Timeout, - out _); + sense = _dev.Read12(out buffer, out _, 0, false, true, false, false, 0, 512, 0, 1, false, _dev.Timeout, + out _); if(sense) { - dumpLog.WriteLine("Could not read..."); + _dumpLog.WriteLine("Could not read..."); StoppingErrorMessage?.Invoke("Could not read..."); return; @@ -104,18 +104,18 @@ namespace DiscImageChef.Core.Devices.Dumping ushort fatStart = (ushort)((buffer[0x0F] << 8) + buffer[0x0E]); ushort sectorsPerFat = (ushort)((buffer[0x17] << 8) + buffer[0x16]); - ushort rootStart = (ushort)(sectorsPerFat * 2 + fatStart); + ushort rootStart = (ushort)((sectorsPerFat * 2) + fatStart); UpdateStatus?.Invoke($"Reading root directory in sector {rootStart}..."); - dumpLog.WriteLine("Reading root directory in sector {0}...", rootStart); + _dumpLog.WriteLine("Reading root directory in sector {0}...", rootStart); - sense = dev.Read12(out buffer, out _, 0, false, true, false, false, rootStart, 512, 0, 1, false, - dev.Timeout, out _); + sense = _dev.Read12(out buffer, out _, 0, false, true, false, false, rootStart, 512, 0, 1, false, + _dev.Timeout, out _); if(sense) { StoppingErrorMessage?.Invoke("Could not read..."); - dumpLog.WriteLine("Could not read..."); + _dumpLog.WriteLine("Could not read..."); return; } @@ -131,10 +131,10 @@ namespace DiscImageChef.Core.Devices.Dumping } UpdateStatus?.Invoke($"FAT starts at sector {fatStart} and runs for {sectorsPerFat} sectors..."); - dumpLog.WriteLine("FAT starts at sector {0} and runs for {1} sectors...", fatStart, sectorsPerFat); + _dumpLog.WriteLine("FAT starts at sector {0} and runs for {1} sectors...", fatStart, sectorsPerFat); UpdateStatus?.Invoke("Reading FAT..."); - dumpLog.WriteLine("Reading FAT..."); + _dumpLog.WriteLine("Reading FAT..."); byte[] fat = new byte[sectorsPerFat * 512]; @@ -147,13 +147,13 @@ namespace DiscImageChef.Core.Devices.Dumping if(transfer + position > sectorsPerFat) transfer = sectorsPerFat - position; - sense = dev.Read12(out buffer, out _, 0, false, true, false, false, position + fatStart, 512, 0, - transfer, false, dev.Timeout, out _); + sense = _dev.Read12(out buffer, out _, 0, false, true, false, false, position + fatStart, 512, 0, + transfer, false, _dev.Timeout, out _); if(sense) { StoppingErrorMessage?.Invoke("Could not read..."); - dumpLog.WriteLine("Could not read..."); + _dumpLog.WriteLine("Could not read..."); return; } @@ -164,7 +164,7 @@ namespace DiscImageChef.Core.Devices.Dumping } UpdateStatus?.Invoke("Traversing FAT..."); - dumpLog.WriteLine("Traversing FAT..."); + _dumpLog.WriteLine("Traversing FAT..."); ushort previousCluster = BitConverter.ToUInt16(fat, 4); @@ -187,7 +187,7 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - if(outputPlugin is IWritableOpticalImage) + if(_outputPlugin is IWritableOpticalImage) DumpUmd(); else StoppingErrorMessage?.Invoke("The specified plugin does not support storing optical disc images."); @@ -205,32 +205,32 @@ namespace DiscImageChef.Core.Devices.Dumping DateTime start; DateTime end; - bool sense = dev.Read12(out byte[] readBuffer, out _, 0, false, true, false, false, 0, 512, 0, 1, false, - dev.Timeout, out _); + bool sense = _dev.Read12(out byte[] readBuffer, out _, 0, false, true, false, false, 0, 512, 0, 1, false, + _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Could not read..."); + _dumpLog.WriteLine("Could not read..."); StoppingErrorMessage?.Invoke("Could not read..."); return; } - ushort fatStart = (ushort)((readBuffer[0x0F] << 8) + readBuffer[0x0E]); - ushort sectorsPerFat = (ushort)((readBuffer[0x17] << 8) + readBuffer[0x16]); - ushort rootStart = (ushort)(sectorsPerFat * 2 + fatStart); - ushort rootSize = (ushort)(((readBuffer[0x12] << 8) + readBuffer[0x11]) * 32 / 512); + ushort fatStart = (ushort)((readBuffer[0x0F] << 8) + readBuffer[0x0E]); + ushort sectorsPerFat = (ushort)((readBuffer[0x17] << 8) + readBuffer[0x16]); + ushort rootStart = (ushort)((sectorsPerFat * 2) + fatStart); + ushort rootSize = (ushort)((((readBuffer[0x12] << 8) + readBuffer[0x11]) * 32) / 512); ushort umdStart = (ushort)(rootStart + rootSize); UpdateStatus?.Invoke($"Reading root directory in sector {rootStart}..."); - dumpLog.WriteLine("Reading root directory in sector {0}...", rootStart); + _dumpLog.WriteLine("Reading root directory in sector {0}...", rootStart); - sense = dev.Read12(out readBuffer, out _, 0, false, true, false, false, rootStart, 512, 0, 1, false, - dev.Timeout, out _); + sense = _dev.Read12(out readBuffer, out _, 0, false, true, false, false, rootStart, 512, 0, 1, false, + _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Could not read..."); + _dumpLog.WriteLine("Could not read..."); StoppingErrorMessage?.Invoke("Could not read..."); return; @@ -247,31 +247,31 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke($"Device can read {blocksToRead} blocks at a time."); UpdateStatus?.Invoke($"Device reports {BLOCK_SIZE} bytes per logical block."); UpdateStatus?.Invoke($"Device reports {2048} bytes per physical block."); - UpdateStatus?.Invoke($"SCSI device type: {dev.ScsiType}."); + UpdateStatus?.Invoke($"SCSI device type: {_dev.ScsiType}."); UpdateStatus?.Invoke($"Media identified as {DSK_TYPE}."); UpdateStatus?.Invoke($"Media part number is {mediaPartNumber}."); - dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * BLOCK_SIZE); - dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); - dumpLog.WriteLine("Device reports {0} bytes per logical block.", BLOCK_SIZE); - dumpLog.WriteLine("Device reports {0} bytes per physical block.", 2048); - dumpLog.WriteLine("SCSI device type: {0}.", dev.ScsiType); - dumpLog.WriteLine("Media identified as {0}.", DSK_TYPE); - dumpLog.WriteLine("Media part number is {0}.", mediaPartNumber); + _dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * BLOCK_SIZE); + _dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); + _dumpLog.WriteLine("Device reports {0} bytes per logical block.", BLOCK_SIZE); + _dumpLog.WriteLine("Device reports {0} bytes per physical block.", 2048); + _dumpLog.WriteLine("SCSI device type: {0}.", _dev.ScsiType); + _dumpLog.WriteLine("Media identified as {0}.", DSK_TYPE); + _dumpLog.WriteLine("Media part number is {0}.", mediaPartNumber); bool ret; - var mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, BLOCK_SIZE, blocksToRead); - var ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0010); - ret = outputPlugin.Create(outputPath, DSK_TYPE, formatOptions, blocks, BLOCK_SIZE); + var mhddLog = new MhddLog(_outputPrefix + ".mhddlog.bin", _dev, blocks, BLOCK_SIZE, blocksToRead); + var ibgLog = new IbgLog(_outputPrefix + ".ibg", 0x0010); + ret = _outputPlugin.Create(_outputPath, DSK_TYPE, _formatOptions, blocks, BLOCK_SIZE); // Cannot create image if(!ret) { - dumpLog.WriteLine("Error creating output image, not continuing."); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Error creating output image, not continuing."); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error creating output image, not continuing." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -279,7 +279,7 @@ namespace DiscImageChef.Core.Devices.Dumping start = DateTime.UtcNow; double imageWriteDuration = 0; - (outputPlugin as IWritableOpticalImage).SetTracks(new List + (_outputPlugin as IWritableOpticalImage).SetTracks(new List { new Track { @@ -292,8 +292,8 @@ namespace DiscImageChef.Core.Devices.Dumping DumpHardwareType currentTry = null; ExtentsULong extents = null; - ResumeSupport.Process(true, dev.IsRemovable, blocks, dev.Manufacturer, dev.Model, dev.Serial, - dev.PlatformId, ref resume, ref currentTry, ref extents); + ResumeSupport.Process(true, _dev.IsRemovable, blocks, _dev.Manufacturer, _dev.Model, _dev.Serial, + _dev.PlatformId, ref _resume, ref currentTry, ref extents); if(currentTry == null || extents == null) @@ -303,8 +303,8 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - if(resume.NextBlock > 0) - dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock); + if(_resume.NextBlock > 0) + _dumpLog.WriteLine("Resuming from block {0}.", _resume.NextBlock); bool newTrim = false; @@ -312,13 +312,13 @@ namespace DiscImageChef.Core.Devices.Dumping ulong sectorSpeedStart = 0; InitProgress?.Invoke(); - for(ulong i = resume.NextBlock; i < blocks; i += blocksToRead) + for(ulong i = _resume.NextBlock; i < blocks; i += blocksToRead) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -339,55 +339,55 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateProgress?.Invoke($"Reading sector {i} of {blocks} ({currentSpeed:F3} MiB/sec.)", (long)i, (long)blocks); - sense = dev.Read12(out readBuffer, out _, 0, false, true, false, false, (uint)(umdStart + i * 4), 512, - 0, blocksToRead * 4, false, dev.Timeout, out double cmdDuration); + sense = _dev.Read12(out readBuffer, out _, 0, false, true, false, false, (uint)(umdStart + (i * 4)), + 512, 0, blocksToRead * 4, false, _dev.Timeout, out double cmdDuration); totalDuration += cmdDuration; if(!sense && - !dev.Error) + !_dev.Error) { mhddLog.Write(i, cmdDuration); ibgLog.Write(i, currentSpeed * 1024); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(readBuffer, i, blocksToRead); + _outputPlugin.WriteSectors(readBuffer, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); } else { // TODO: Reset device after X errors - if(stopOnError) + if(_stopOnError) return; // TODO: Return more cleanly - if(i + skip > blocks) - skip = (uint)(blocks - i); + if(i + _skip > blocks) + _skip = (uint)(blocks - i); // Write empty data DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(new byte[BLOCK_SIZE * skip], i, skip); + _outputPlugin.WriteSectors(new byte[BLOCK_SIZE * _skip], i, _skip); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; - for(ulong b = i; b < i + skip; b++) - resume.BadBlocks.Add(b); + for(ulong b = i; b < i + _skip; b++) + _resume.BadBlocks.Add(b); mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration); ibgLog.Write(i, 0); - dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", skip, i); - i += skip - blocksToRead; + _dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", _skip, i); + i += _skip - blocksToRead; newTrim = true; } - sectorSpeedStart += blocksToRead; - resume.NextBlock = i + blocksToRead; + sectorSpeedStart += blocksToRead; + _resume.NextBlock = i + blocksToRead; double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; if(elapsed < 1) continue; - currentSpeed = sectorSpeedStart * BLOCK_SIZE / (1048576 * elapsed); + currentSpeed = (sectorSpeedStart * BLOCK_SIZE) / (1048576 * elapsed); sectorSpeedStart = 0; timeSpeedStart = DateTime.UtcNow; } @@ -396,72 +396,72 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); mhddLog.Close(); - ibgLog.Close(dev, blocks, BLOCK_SIZE, (end - start).TotalSeconds, currentSpeed * 1024, - BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalDuration / 1000), - devicePath); + ibgLog.Close(_dev, blocks, BLOCK_SIZE, (end - start).TotalSeconds, currentSpeed * 1024, + (BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalDuration / 1000), + _devicePath); UpdateStatus?.Invoke($"Dump finished in {(end - start).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average dump speed {(double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalDuration / 1000):F3} KiB/sec."); + Invoke($"Average dump speed {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalDuration / 1000):F3} KiB/sec."); UpdateStatus?. - Invoke($"Average write speed {(double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / imageWriteDuration:F3} KiB/sec."); + Invoke($"Average write speed {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / imageWriteDuration:F3} KiB/sec."); - dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); - dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", - (double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalDuration / 1000)); + _dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", + ((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalDuration / 1000)); - dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", - (double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / imageWriteDuration); + _dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", + ((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / imageWriteDuration); #region Trimming - if(resume.BadBlocks.Count > 0 && - !aborted && - !notrim && + if(_resume.BadBlocks.Count > 0 && + !_aborted && + !_notrim && newTrim) { start = DateTime.UtcNow; - dumpLog.WriteLine("Trimming bad sectors"); + _dumpLog.WriteLine("Trimming bad sectors"); - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); InitProgress?.Invoke(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } PulseProgress?.Invoke($"Trimming sector {badSector}"); - sense = dev.Read12(out readBuffer, out _, 0, false, true, false, false, - (uint)(umdStart + badSector * 4), 512, 0, 4, false, dev.Timeout, - out double cmdDuration); + sense = _dev.Read12(out readBuffer, out _, 0, false, true, false, false, + (uint)(umdStart + (badSector * 4)), 512, 0, 4, false, _dev.Timeout, + out double cmdDuration); - if(sense || dev.Error) + if(sense || _dev.Error) continue; - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); } EndProgress?.Invoke(); end = DateTime.UtcNow; - dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); } #endregion Trimming #region Error handling - if(resume.BadBlocks.Count > 0 && - !aborted && - retryPasses > 0) + if(_resume.BadBlocks.Count > 0 && + !_aborted && + _retryPasses > 0) { int pass = 1; bool forward = true; @@ -470,16 +470,16 @@ namespace DiscImageChef.Core.Devices.Dumping Modes.ModePage? currentModePage = null; byte[] md6; - if(persistent) + if(_persistent) { Modes.ModePage_01 pg; - sense = dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, - dev.Timeout, out _); + sense = _dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, + _dev.Timeout, out _); if(!sense) { - Modes.DecodedMode? dcMode6 = Modes.DecodeMode6(readBuffer, dev.ScsiType); + Modes.DecodedMode? dcMode6 = Modes.DecodeMode6(readBuffer, _dev.ScsiType); if(dcMode6.HasValue) foreach(Modes.ModePage modePage in dcMode6.Value.Pages) @@ -521,10 +521,10 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); - dumpLog.WriteLine("Sending MODE SELECT to drive (return damaged blocks)."); - sense = dev.ModeSelect(md6, out byte[] senseBuf, true, false, dev.Timeout, out _); + _dumpLog.WriteLine("Sending MODE SELECT to drive (return damaged blocks)."); + sense = _dev.ModeSelect(md6, out byte[] senseBuf, true, false, _dev.Timeout, out _); if(sense) { @@ -533,7 +533,7 @@ namespace DiscImageChef.Core.Devices.Dumping DicConsole.DebugWriteLine("Error: {0}", Sense.PrettifySense(senseBuf)); - dumpLog. + _dumpLog. WriteLine("Drive did not accept MODE SELECT command for persistent error reading, try another drive."); } else @@ -542,14 +542,14 @@ namespace DiscImageChef.Core.Devices.Dumping InitProgress?.Invoke(); repeatRetry: - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -557,36 +557,36 @@ namespace DiscImageChef.Core.Devices.Dumping PulseProgress?. Invoke($"Retrying sector {badSector}, pass {pass}, {(runningPersistent ? "recovering partial data, " : "")}{(forward ? "forward" : "reverse")}"); - sense = dev.Read12(out readBuffer, out _, 0, false, true, false, false, - (uint)(umdStart + badSector * 4), 512, 0, 4, false, dev.Timeout, - out double cmdDuration); + sense = _dev.Read12(out readBuffer, out _, 0, false, true, false, false, + (uint)(umdStart + (badSector * 4)), 512, 0, 4, false, _dev.Timeout, + out double cmdDuration); totalDuration += cmdDuration; if(!sense && - !dev.Error) + !_dev.Error) { - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); UpdateStatus?.Invoke(string.Format("Correctly retried block {0} in pass {1}.", badSector, pass)); - dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); + _dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); } else if(runningPersistent) - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); } - if(pass < retryPasses && - !aborted && - resume.BadBlocks.Count > 0) + if(pass < _retryPasses && + !_aborted && + _resume.BadBlocks.Count > 0) { pass++; forward = !forward; - resume.BadBlocks.Sort(); - resume.BadBlocks.Reverse(); + _resume.BadBlocks.Sort(); + _resume.BadBlocks.Reverse(); goto repeatRetry; } @@ -601,10 +601,10 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); - dumpLog.WriteLine("Sending MODE SELECT to drive (return device to previous status)."); - sense = dev.ModeSelect(md6, out _, true, false, dev.Timeout, out _); + _dumpLog.WriteLine("Sending MODE SELECT to drive (return device to previous status)."); + sense = _dev.ModeSelect(md6, out _, true, false, _dev.Timeout, out _); } EndProgress?.Invoke(); @@ -612,10 +612,10 @@ namespace DiscImageChef.Core.Devices.Dumping } #endregion Error handling - resume.BadBlocks.Sort(); + _resume.BadBlocks.Sort(); - foreach(ulong bad in resume.BadBlocks) - dumpLog.WriteLine("Sector {0} could not be read.", bad); + foreach(ulong bad in _resume.BadBlocks) + _dumpLog.WriteLine("Sector {0} could not be read.", bad); currentTry.Extents = ExtentsConverter.ToMetadata(extents); @@ -625,38 +625,38 @@ namespace DiscImageChef.Core.Devices.Dumping MediaPartNumber = mediaPartNumber }; - if(!outputPlugin.SetMetadata(metadata)) + if(!_outputPlugin.SetMetadata(metadata)) ErrorMessage?.Invoke("Error {0} setting metadata, continuing..." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); - outputPlugin.SetDumpHardware(resume.Tries); + _outputPlugin.SetDumpHardware(_resume.Tries); - if(preSidecar != null) - outputPlugin.SetCicmMetadata(preSidecar); + if(_preSidecar != null) + _outputPlugin.SetCicmMetadata(_preSidecar); - dumpLog.WriteLine("Closing output file."); + _dumpLog.WriteLine("Closing output file."); UpdateStatus?.Invoke("Closing output file."); DateTime closeStart = DateTime.Now; - outputPlugin.Close(); + _outputPlugin.Close(); DateTime closeEnd = DateTime.Now; - dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); + _dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); - if(aborted) + if(_aborted) { UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); return; } double totalChkDuration = 0; - if(!nometadata) + if(!_nometadata) { UpdateStatus?.Invoke("Creating sidecar."); - dumpLog.WriteLine("Creating sidecar."); + _dumpLog.WriteLine("Creating sidecar."); var filters = new FiltersList(); - IFilter filter = filters.GetFilter(outputPath); + IFilter filter = filters.GetFilter(_outputPath); IMediaImage inputPlugin = ImageFormat.Detect(filter); if(!inputPlugin.Open(filter)) @@ -667,32 +667,32 @@ namespace DiscImageChef.Core.Devices.Dumping } DateTime chkStart = DateTime.UtcNow; - sidecarClass = new Sidecar(inputPlugin, outputPath, filter.Id, encoding); - sidecarClass.InitProgressEvent += InitProgress; - sidecarClass.UpdateProgressEvent += UpdateProgress; - sidecarClass.EndProgressEvent += EndProgress; - sidecarClass.InitProgressEvent2 += InitProgress2; - sidecarClass.UpdateProgressEvent2 += UpdateProgress2; - sidecarClass.EndProgressEvent2 += EndProgress2; - sidecarClass.UpdateStatusEvent += UpdateStatus; - CICMMetadataType sidecar = sidecarClass.Create(); + _sidecarClass = new Sidecar(inputPlugin, _outputPath, filter.Id, _encoding); + _sidecarClass.InitProgressEvent += InitProgress; + _sidecarClass.UpdateProgressEvent += UpdateProgress; + _sidecarClass.EndProgressEvent += EndProgress; + _sidecarClass.InitProgressEvent2 += InitProgress2; + _sidecarClass.UpdateProgressEvent2 += UpdateProgress2; + _sidecarClass.EndProgressEvent2 += EndProgress2; + _sidecarClass.UpdateStatusEvent += UpdateStatus; + CICMMetadataType sidecar = _sidecarClass.Create(); end = DateTime.UtcNow; totalChkDuration = (end - chkStart).TotalMilliseconds; UpdateStatus?.Invoke($"Sidecar created in {(end - chkStart).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average checksum speed {(double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); + Invoke($"Average checksum speed {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); - dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); + _dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); - dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", - (double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000)); + _dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", + ((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000)); - if(preSidecar != null) + if(_preSidecar != null) { - preSidecar.OpticalDisc = sidecar.OpticalDisc; - sidecar = preSidecar; + _preSidecar.OpticalDisc = sidecar.OpticalDisc; + sidecar = _preSidecar; } List<(ulong start, string type)> filesystems = new List<(ulong start, string type)>(); @@ -711,7 +711,7 @@ namespace DiscImageChef.Core.Devices.Dumping }).Distinct()) { UpdateStatus?.Invoke($"Found filesystem {filesystem.type} at sector {filesystem.start}"); - dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); + _dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); } // TODO: Implement layers @@ -719,11 +719,11 @@ namespace DiscImageChef.Core.Devices.Dumping (string type, string subType) discType = CommonTypes.Metadata.MediaType.MediaTypeToString(DSK_TYPE); sidecar.OpticalDisc[0].DiscType = discType.type; sidecar.OpticalDisc[0].DiscSubType = discType.subType; - sidecar.OpticalDisc[0].DumpHardwareArray = resume.Tries.ToArray(); + sidecar.OpticalDisc[0].DumpHardwareArray = _resume.Tries.ToArray(); UpdateStatus?.Invoke("Writing metadata sidecar"); - var xmlFs = new FileStream(outputPrefix + ".cicm.xml", FileMode.Create); + var xmlFs = new FileStream(_outputPrefix + ".cicm.xml", FileMode.Create); var xmlSer = new XmlSerializer(typeof(CICMMetadataType)); xmlSer.Serialize(xmlFs, sidecar); @@ -736,11 +736,11 @@ namespace DiscImageChef.Core.Devices.Dumping Invoke($"Took a total of {(end - start).TotalSeconds:F3} seconds ({totalDuration / 1000:F3} processing commands, {totalChkDuration / 1000:F3} checksumming, {imageWriteDuration:F3} writing, {(closeEnd - closeStart).TotalSeconds:F3} closing)."); UpdateStatus?. - Invoke($"Average speed: {(double)BLOCK_SIZE * (double)(blocks + 1) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); + Invoke($"Average speed: {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); UpdateStatus?.Invoke($"Fastest speed burst: {maxSpeed:F3} MiB/sec."); UpdateStatus?.Invoke($"Slowest speed burst: {minSpeed:F3} MiB/sec."); - UpdateStatus?.Invoke($"{resume.BadBlocks.Count} sectors could not be read."); + UpdateStatus?.Invoke($"{_resume.BadBlocks.Count} sectors could not be read."); UpdateStatus?.Invoke(""); Statistics.AddMedia(DSK_TYPE, true); @@ -760,11 +760,11 @@ namespace DiscImageChef.Core.Devices.Dumping MediaType dskType; bool sense; - sense = dev.ReadCapacity(out byte[] readBuffer, out _, dev.Timeout, out _); + sense = _dev.ReadCapacity(out byte[] readBuffer, out _, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Could not detect capacity..."); + _dumpLog.WriteLine("Could not detect capacity..."); StoppingErrorMessage?.Invoke("Could not detect capacity..."); return; @@ -779,7 +779,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(blocks == 0) { - dumpLog.WriteLine("ERROR: Unable to read medium or empty medium present..."); + _dumpLog.WriteLine("ERROR: Unable to read medium or empty medium present..."); StoppingErrorMessage?.Invoke("Unable to read medium or empty medium present..."); return; @@ -788,35 +788,35 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke($"Device reports {blocks} blocks ({blocks * BLOCK_SIZE} bytes)."); UpdateStatus?.Invoke($"Device can read {blocksToRead} blocks at a time."); UpdateStatus?.Invoke($"Device reports {BLOCK_SIZE} bytes per logical block."); - UpdateStatus?.Invoke($"SCSI device type: {dev.ScsiType}."); + UpdateStatus?.Invoke($"SCSI device type: {_dev.ScsiType}."); if(blocks > 262144) { dskType = MediaType.MemoryStickProDuo; - dumpLog.WriteLine("Media detected as MemoryStick Pro Duo..."); + _dumpLog.WriteLine("Media detected as MemoryStick Pro Duo..."); UpdateStatus?.Invoke("Media detected as MemoryStick Pro Duo..."); } else { dskType = MediaType.MemoryStickDuo; - dumpLog.WriteLine("Media detected as MemoryStick Duo..."); + _dumpLog.WriteLine("Media detected as MemoryStick Duo..."); UpdateStatus?.Invoke("Media detected as MemoryStick Duo..."); } bool ret; - var mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, BLOCK_SIZE, blocksToRead); - var ibgLog = new IbgLog(outputPrefix + ".ibg", SBC_PROFILE); - ret = outputPlugin.Create(outputPath, dskType, formatOptions, blocks, BLOCK_SIZE); + var mhddLog = new MhddLog(_outputPrefix + ".mhddlog.bin", _dev, blocks, BLOCK_SIZE, blocksToRead); + var ibgLog = new IbgLog(_outputPrefix + ".ibg", SBC_PROFILE); + ret = _outputPlugin.Create(_outputPath, dskType, _formatOptions, blocks, BLOCK_SIZE); // Cannot create image if(!ret) { - dumpLog.WriteLine("Error creating output image, not continuing."); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Error creating output image, not continuing."); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error creating output image, not continuing." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -827,8 +827,8 @@ namespace DiscImageChef.Core.Devices.Dumping DumpHardwareType currentTry = null; ExtentsULong extents = null; - ResumeSupport.Process(true, dev.IsRemovable, blocks, dev.Manufacturer, dev.Model, dev.Serial, - dev.PlatformId, ref resume, ref currentTry, ref extents); + ResumeSupport.Process(true, _dev.IsRemovable, blocks, _dev.Manufacturer, _dev.Model, _dev.Serial, + _dev.PlatformId, ref _resume, ref currentTry, ref extents); if(currentTry == null || extents == null) @@ -838,8 +838,8 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - if(resume.NextBlock > 0) - dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock); + if(_resume.NextBlock > 0) + _dumpLog.WriteLine("Resuming from block {0}.", _resume.NextBlock); bool newTrim = false; @@ -847,13 +847,13 @@ namespace DiscImageChef.Core.Devices.Dumping ulong sectorSpeedStart = 0; InitProgress?.Invoke(); - for(ulong i = resume.NextBlock; i < blocks; i += blocksToRead) + for(ulong i = _resume.NextBlock; i < blocks; i += blocksToRead) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -873,55 +873,55 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateProgress?.Invoke($"Reading sector {i} of {blocks} ({currentSpeed:F3} MiB/sec.)", (long)i, blocks); - sense = dev.Read12(out readBuffer, out _, 0, false, true, false, false, (uint)i, BLOCK_SIZE, 0, - blocksToRead, false, dev.Timeout, out double cmdDuration); + sense = _dev.Read12(out readBuffer, out _, 0, false, true, false, false, (uint)i, BLOCK_SIZE, 0, + blocksToRead, false, _dev.Timeout, out double cmdDuration); totalDuration += cmdDuration; if(!sense && - !dev.Error) + !_dev.Error) { mhddLog.Write(i, cmdDuration); ibgLog.Write(i, currentSpeed * 1024); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(readBuffer, i, blocksToRead); + _outputPlugin.WriteSectors(readBuffer, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); } else { // TODO: Reset device after X errors - if(stopOnError) + if(_stopOnError) return; // TODO: Return more cleanly - if(i + skip > blocks) - skip = (uint)(blocks - i); + if(i + _skip > blocks) + _skip = (uint)(blocks - i); // Write empty data DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(new byte[BLOCK_SIZE * skip], i, skip); + _outputPlugin.WriteSectors(new byte[BLOCK_SIZE * _skip], i, _skip); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; - for(ulong b = i; b < i + skip; b++) - resume.BadBlocks.Add(b); + for(ulong b = i; b < i + _skip; b++) + _resume.BadBlocks.Add(b); mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration); ibgLog.Write(i, 0); - dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", skip, i); - i += skip - blocksToRead; + _dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", _skip, i); + i += _skip - blocksToRead; newTrim = true; } - sectorSpeedStart += blocksToRead; - resume.NextBlock = i + blocksToRead; + sectorSpeedStart += blocksToRead; + _resume.NextBlock = i + blocksToRead; double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; if(elapsed < 1) continue; - currentSpeed = sectorSpeedStart * BLOCK_SIZE / (1048576 * elapsed); + currentSpeed = (sectorSpeedStart * BLOCK_SIZE) / (1048576 * elapsed); sectorSpeedStart = 0; timeSpeedStart = DateTime.UtcNow; } @@ -930,73 +930,73 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); mhddLog.Close(); - ibgLog.Close(dev, blocks, BLOCK_SIZE, (end - start).TotalSeconds, currentSpeed * 1024, - BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalDuration / 1000), - devicePath); + ibgLog.Close(_dev, blocks, BLOCK_SIZE, (end - start).TotalSeconds, currentSpeed * 1024, + (BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalDuration / 1000), + _devicePath); UpdateStatus?.Invoke($"Dump finished in {(end - start).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average dump speed {(double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalDuration / 1000):F3} KiB/sec."); + Invoke($"Average dump speed {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalDuration / 1000):F3} KiB/sec."); UpdateStatus?. - Invoke($"Average write speed {(double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / imageWriteDuration:F3} KiB/sec."); + Invoke($"Average write speed {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / imageWriteDuration:F3} KiB/sec."); - dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); - dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", - (double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalDuration / 1000)); + _dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", + ((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalDuration / 1000)); - dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", - (double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / imageWriteDuration); + _dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", + ((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / imageWriteDuration); #region Trimming - if(resume.BadBlocks.Count > 0 && - !aborted && - !notrim && + if(_resume.BadBlocks.Count > 0 && + !_aborted && + !_notrim && newTrim) { start = DateTime.UtcNow; UpdateStatus?.Invoke("Trimming bad sectors"); - dumpLog.WriteLine("Trimming bad sectors"); + _dumpLog.WriteLine("Trimming bad sectors"); - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); InitProgress?.Invoke(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } PulseProgress?.Invoke($"Trimming sector {badSector}"); - sense = dev.Read12(out readBuffer, out _, 0, false, true, false, false, (uint)badSector, BLOCK_SIZE, - 0, 1, false, dev.Timeout, out double cmdDuration); + sense = _dev.Read12(out readBuffer, out _, 0, false, true, false, false, (uint)badSector, + BLOCK_SIZE, 0, 1, false, _dev.Timeout, out double cmdDuration); - if(sense || dev.Error) + if(sense || _dev.Error) continue; - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); } EndProgress?.Invoke(); end = DateTime.UtcNow; - dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); } #endregion Trimming #region Error handling - if(resume.BadBlocks.Count > 0 && - !aborted && - retryPasses > 0) + if(_resume.BadBlocks.Count > 0 && + !_aborted && + _retryPasses > 0) { int pass = 1; bool forward = true; @@ -1005,21 +1005,21 @@ namespace DiscImageChef.Core.Devices.Dumping Modes.ModePage? currentModePage = null; byte[] md6; - if(persistent) + if(_persistent) { Modes.ModePage_01 pg; - sense = dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, - dev.Timeout, out _); + sense = _dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, + _dev.Timeout, out _); if(sense) { - sense = dev.ModeSense10(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, - dev.Timeout, out _); + sense = _dev.ModeSense10(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, + _dev.Timeout, out _); if(!sense) { - Modes.DecodedMode? dcMode10 = Modes.DecodeMode10(readBuffer, dev.ScsiType); + Modes.DecodedMode? dcMode10 = Modes.DecodeMode10(readBuffer, _dev.ScsiType); if(dcMode10.HasValue) foreach(Modes.ModePage modePage in dcMode10.Value.Pages) @@ -1030,7 +1030,7 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - Modes.DecodedMode? dcMode6 = Modes.DecodeMode6(readBuffer, dev.ScsiType); + Modes.DecodedMode? dcMode6 = Modes.DecodeMode6(readBuffer, _dev.ScsiType); if(dcMode6.HasValue) foreach(Modes.ModePage modePage in dcMode6.Value.Pages) @@ -1072,11 +1072,11 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); UpdateStatus?.Invoke("Sending MODE SELECT to drive (return damaged blocks)."); - dumpLog.WriteLine("Sending MODE SELECT to drive (return damaged blocks)."); - sense = dev.ModeSelect(md6, out byte[] senseBuf, true, false, dev.Timeout, out _); + _dumpLog.WriteLine("Sending MODE SELECT to drive (return damaged blocks)."); + sense = _dev.ModeSelect(md6, out byte[] senseBuf, true, false, _dev.Timeout, out _); if(sense) { @@ -1085,7 +1085,7 @@ namespace DiscImageChef.Core.Devices.Dumping DicConsole.DebugWriteLine("Error: {0}", Sense.PrettifySense(senseBuf)); - dumpLog. + _dumpLog. WriteLine("Drive did not accept MODE SELECT command for persistent error reading, try another drive."); } else @@ -1094,14 +1094,14 @@ namespace DiscImageChef.Core.Devices.Dumping InitProgress?.Invoke(); repeatRetry: - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -1110,32 +1110,32 @@ namespace DiscImageChef.Core.Devices.Dumping forward ? "forward" : "reverse", runningPersistent ? "recovering partial data, " : "")); - sense = dev.Read12(out readBuffer, out _, 0, false, true, false, false, (uint)badSector, BLOCK_SIZE, - 0, 1, false, dev.Timeout, out double cmdDuration); + sense = _dev.Read12(out readBuffer, out _, 0, false, true, false, false, (uint)badSector, + BLOCK_SIZE, 0, 1, false, _dev.Timeout, out double cmdDuration); totalDuration += cmdDuration; if(!sense && - !dev.Error) + !_dev.Error) { - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); UpdateStatus?.Invoke($"Correctly retried block {badSector} in pass {pass}."); - dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); + _dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); } else if(runningPersistent) - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); } - if(pass < retryPasses && - !aborted && - resume.BadBlocks.Count > 0) + if(pass < _retryPasses && + !_aborted && + _resume.BadBlocks.Count > 0) { pass++; forward = !forward; - resume.BadBlocks.Sort(); - resume.BadBlocks.Reverse(); + _resume.BadBlocks.Sort(); + _resume.BadBlocks.Reverse(); goto repeatRetry; } @@ -1150,53 +1150,53 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); UpdateStatus?.Invoke("Sending MODE SELECT to drive (return device to previous status)."); - dumpLog.WriteLine("Sending MODE SELECT to drive (return device to previous status)."); - sense = dev.ModeSelect(md6, out _, true, false, dev.Timeout, out _); + _dumpLog.WriteLine("Sending MODE SELECT to drive (return device to previous status)."); + sense = _dev.ModeSelect(md6, out _, true, false, _dev.Timeout, out _); } EndProgress?.Invoke(); } #endregion Error handling - resume.BadBlocks.Sort(); + _resume.BadBlocks.Sort(); - foreach(ulong bad in resume.BadBlocks) - dumpLog.WriteLine("Sector {0} could not be read.", bad); + foreach(ulong bad in _resume.BadBlocks) + _dumpLog.WriteLine("Sector {0} could not be read.", bad); currentTry.Extents = ExtentsConverter.ToMetadata(extents); - outputPlugin.SetDumpHardware(resume.Tries); + _outputPlugin.SetDumpHardware(_resume.Tries); - if(preSidecar != null) - outputPlugin.SetCicmMetadata(preSidecar); + if(_preSidecar != null) + _outputPlugin.SetCicmMetadata(_preSidecar); - dumpLog.WriteLine("Closing output file."); + _dumpLog.WriteLine("Closing output file."); UpdateStatus?.Invoke("Closing output file."); DateTime closeStart = DateTime.Now; - outputPlugin.Close(); + _outputPlugin.Close(); DateTime closeEnd = DateTime.Now; UpdateStatus?.Invoke($"Closed in {(closeEnd - closeStart).TotalSeconds} seconds."); - dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); + _dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); - if(aborted) + if(_aborted) { UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); return; } double totalChkDuration = 0; - if(!nometadata) + if(!_nometadata) { UpdateStatus?.Invoke("Creating sidecar."); - dumpLog.WriteLine("Creating sidecar."); + _dumpLog.WriteLine("Creating sidecar."); var filters = new FiltersList(); - IFilter filter = filters.GetFilter(outputPath); + IFilter filter = filters.GetFilter(_outputPath); IMediaImage inputPlugin = ImageFormat.Detect(filter); if(!inputPlugin.Open(filter)) @@ -1207,32 +1207,32 @@ namespace DiscImageChef.Core.Devices.Dumping } DateTime chkStart = DateTime.UtcNow; - sidecarClass = new Sidecar(inputPlugin, outputPath, filter.Id, encoding); - sidecarClass.InitProgressEvent += InitProgress; - sidecarClass.UpdateProgressEvent += UpdateProgress; - sidecarClass.EndProgressEvent += EndProgress; - sidecarClass.InitProgressEvent2 += InitProgress2; - sidecarClass.UpdateProgressEvent2 += UpdateProgress2; - sidecarClass.EndProgressEvent2 += EndProgress2; - sidecarClass.UpdateStatusEvent += UpdateStatus; - CICMMetadataType sidecar = sidecarClass.Create(); + _sidecarClass = new Sidecar(inputPlugin, _outputPath, filter.Id, _encoding); + _sidecarClass.InitProgressEvent += InitProgress; + _sidecarClass.UpdateProgressEvent += UpdateProgress; + _sidecarClass.EndProgressEvent += EndProgress; + _sidecarClass.InitProgressEvent2 += InitProgress2; + _sidecarClass.UpdateProgressEvent2 += UpdateProgress2; + _sidecarClass.EndProgressEvent2 += EndProgress2; + _sidecarClass.UpdateStatusEvent += UpdateStatus; + CICMMetadataType sidecar = _sidecarClass.Create(); end = DateTime.UtcNow; totalChkDuration = (end - chkStart).TotalMilliseconds; UpdateStatus?.Invoke($"Sidecar created in {(end - chkStart).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average checksum speed {(double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); + Invoke($"Average checksum speed {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); - dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); + _dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); - dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", - (double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000)); + _dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", + ((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000)); - if(preSidecar != null) + if(_preSidecar != null) { - preSidecar.BlockMedia = sidecar.BlockMedia; - sidecar = preSidecar; + _preSidecar.BlockMedia = sidecar.BlockMedia; + sidecar = _preSidecar; } List<(ulong start, string type)> filesystems = new List<(ulong start, string type)>(); @@ -1249,7 +1249,7 @@ namespace DiscImageChef.Core.Devices.Dumping }).Distinct()) { UpdateStatus?.Invoke($"Found filesystem {filesystem.type} at sector {filesystem.start}"); - dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); + _dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); } sidecar.BlockMedia[0].Dimensions = Dimensions.DimensionsFromMediaType(dskType); @@ -1260,17 +1260,17 @@ namespace DiscImageChef.Core.Devices.Dumping sidecar.BlockMedia[0].LogicalBlocks = blocks; sidecar.BlockMedia[0].PhysicalBlockSize = (int)BLOCK_SIZE; sidecar.BlockMedia[0].LogicalBlockSize = (int)BLOCK_SIZE; - sidecar.BlockMedia[0].Manufacturer = dev.Manufacturer; - sidecar.BlockMedia[0].Model = dev.Model; - sidecar.BlockMedia[0].Serial = dev.Serial; + sidecar.BlockMedia[0].Manufacturer = _dev.Manufacturer; + sidecar.BlockMedia[0].Model = _dev.Model; + sidecar.BlockMedia[0].Serial = _dev.Serial; sidecar.BlockMedia[0].Size = blocks * BLOCK_SIZE; - if(dev.IsRemovable) - sidecar.BlockMedia[0].DumpHardwareArray = resume.Tries.ToArray(); + if(_dev.IsRemovable) + sidecar.BlockMedia[0].DumpHardwareArray = _resume.Tries.ToArray(); UpdateStatus?.Invoke("Writing metadata sidecar"); - var xmlFs = new FileStream(outputPrefix + ".cicm.xml", FileMode.Create); + var xmlFs = new FileStream(_outputPrefix + ".cicm.xml", FileMode.Create); var xmlSer = new XmlSerializer(typeof(CICMMetadataType)); xmlSer.Serialize(xmlFs, sidecar); @@ -1283,11 +1283,11 @@ namespace DiscImageChef.Core.Devices.Dumping Invoke($"Took a total of {(end - start).TotalSeconds:F3} seconds ({totalDuration / 1000:F3} processing commands, {totalChkDuration / 1000:F3} checksumming, {imageWriteDuration:F3} writing, {(closeEnd - closeStart).TotalSeconds:F3} closing)."); UpdateStatus?. - Invoke($"Average speed: {(double)BLOCK_SIZE * (double)(blocks + 1) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); + Invoke($"Average speed: {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); UpdateStatus?.Invoke($"Fastest speed burst: {maxSpeed:F3} MiB/sec."); UpdateStatus?.Invoke($"Slowest speed burst: {minSpeed:F3} MiB/sec."); - UpdateStatus?.Invoke($"{resume.BadBlocks.Count} sectors could not be read."); + UpdateStatus?.Invoke($"{_resume.BadBlocks.Count} sectors could not be read."); UpdateStatus?.Invoke(""); Statistics.AddMedia(dskType, true); diff --git a/DiscImageChef.Core/Devices/Dumping/SBC.cs b/DiscImageChef.Core/Devices/Dumping/SBC.cs index 7bb68b4a8..325e95dc0 100644 --- a/DiscImageChef.Core/Devices/Dumping/SBC.cs +++ b/DiscImageChef.Core/Devices/Dumping/SBC.cs @@ -85,14 +85,14 @@ namespace DiscImageChef.Core.Devices.Dumping break; } - dumpLog.WriteLine("Initializing reader."); - var scsiReader = new Reader(dev, dev.Timeout, null, dumpRaw); + _dumpLog.WriteLine("Initializing reader."); + var scsiReader = new Reader(_dev, _dev.Timeout, null, _dumpRaw); ulong blocks = scsiReader.GetDeviceBlocks(); uint blockSize = scsiReader.LogicalBlockSize; if(scsiReader.FindReadCommand()) { - dumpLog.WriteLine("ERROR: Cannot find correct read command: {0}.", scsiReader.ErrorMessage); + _dumpLog.WriteLine("ERROR: Cannot find correct read command: {0}.", scsiReader.ErrorMessage); StoppingErrorMessage?.Invoke("Unable to read medium."); return; @@ -110,7 +110,7 @@ namespace DiscImageChef.Core.Devices.Dumping // Check how many blocks to read, if error show and return if(scsiReader.GetBlocksToRead()) { - dumpLog.WriteLine("ERROR: Cannot get blocks to read: {0}.", scsiReader.ErrorMessage); + _dumpLog.WriteLine("ERROR: Cannot get blocks to read: {0}.", scsiReader.ErrorMessage); StoppingErrorMessage?.Invoke(scsiReader.ErrorMessage); return; @@ -122,7 +122,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(blocks == 0) { - dumpLog.WriteLine("ERROR: Unable to read medium or empty medium present..."); + _dumpLog.WriteLine("ERROR: Unable to read medium or empty medium present..."); StoppingErrorMessage?.Invoke("Unable to read medium or empty medium present..."); return; @@ -132,60 +132,60 @@ namespace DiscImageChef.Core.Devices.Dumping { mediaTags = new Dictionary(); - if(dev.IsUsb && - dev.UsbDescriptors != null) + if(_dev.IsUsb && + _dev.UsbDescriptors != null) mediaTags.Add(MediaTagType.USB_Descriptors, null); - if(dev.Type == DeviceType.ATAPI) + if(_dev.Type == DeviceType.ATAPI) mediaTags.Add(MediaTagType.ATAPI_IDENTIFY, null); - if(dev.IsPcmcia && - dev.Cis != null) + if(_dev.IsPcmcia && + _dev.Cis != null) mediaTags.Add(MediaTagType.PCMCIA_CIS, null); - sense = dev.ScsiInquiry(out byte[] cmdBuf, out _); + sense = _dev.ScsiInquiry(out byte[] cmdBuf, out _); mediaTags.Add(MediaTagType.SCSI_INQUIRY, cmdBuf); if(!sense) { - dumpLog.WriteLine("Requesting MODE SENSE (10)."); + _dumpLog.WriteLine("Requesting MODE SENSE (10)."); UpdateStatus?.Invoke("Requesting MODE SENSE (10)."); - sense = dev.ModeSense10(out cmdBuf, out _, false, true, ScsiModeSensePageControl.Current, 0x3F, - 0xFF, 5, out _); + sense = _dev.ModeSense10(out cmdBuf, out _, false, true, ScsiModeSensePageControl.Current, 0x3F, + 0xFF, 5, out _); if(!sense || - dev.Error) - sense = dev.ModeSense10(out cmdBuf, out _, false, true, ScsiModeSensePageControl.Current, 0x3F, - 0x00, 5, out _); + _dev.Error) + sense = _dev.ModeSense10(out cmdBuf, out _, false, true, ScsiModeSensePageControl.Current, 0x3F, + 0x00, 5, out _); if(!sense && - !dev.Error) - if(Modes.DecodeMode10(cmdBuf, dev.ScsiType).HasValue) + !_dev.Error) + if(Modes.DecodeMode10(cmdBuf, _dev.ScsiType).HasValue) { mediaTags.Add(MediaTagType.SCSI_MODESENSE_10, cmdBuf); - decMode = Modes.DecodeMode10(cmdBuf, dev.ScsiType); + decMode = Modes.DecodeMode10(cmdBuf, _dev.ScsiType); } - dumpLog.WriteLine("Requesting MODE SENSE (6)."); + _dumpLog.WriteLine("Requesting MODE SENSE (6)."); UpdateStatus?.Invoke("Requesting MODE SENSE (6)."); - sense = dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, - out _); + sense = _dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, + out _); - if(sense || dev.Error) - sense = dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, - 5, out _); + if(sense || _dev.Error) + sense = _dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, + 5, out _); - if(sense || dev.Error) - sense = dev.ModeSense(out cmdBuf, out _, 5, out _); + if(sense || _dev.Error) + sense = _dev.ModeSense(out cmdBuf, out _, 5, out _); if(!sense && - !dev.Error) - if(Modes.DecodeMode6(cmdBuf, dev.ScsiType).HasValue) + !_dev.Error) + if(Modes.DecodeMode6(cmdBuf, _dev.ScsiType).HasValue) { mediaTags.Add(MediaTagType.SCSI_MODESENSE_6, cmdBuf); - decMode = Modes.DecodeMode6(cmdBuf, dev.ScsiType); + decMode = Modes.DecodeMode6(cmdBuf, _dev.ScsiType); } if(decMode.HasValue) @@ -205,11 +205,11 @@ namespace DiscImageChef.Core.Devices.Dumping } if(dskType == MediaType.Unknown) - dskType = MediaTypeFromScsi.Get((byte)dev.ScsiType, dev.Manufacturer, dev.Model, scsiMediumType, + dskType = MediaTypeFromScsi.Get((byte)_dev.ScsiType, _dev.Manufacturer, _dev.Model, scsiMediumType, scsiDensityCode, blocks, blockSize); if(dskType == MediaType.Unknown && - dev.IsUsb && + _dev.IsUsb && containsFloppyPage) dskType = MediaType.FlashDrive; @@ -217,32 +217,32 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke($"Device can read {blocksToRead} blocks at a time."); UpdateStatus?.Invoke($"Device reports {blockSize} bytes per logical block."); UpdateStatus?.Invoke($"Device reports {scsiReader.LongBlockSize} bytes per physical block."); - UpdateStatus?.Invoke($"SCSI device type: {dev.ScsiType}."); + UpdateStatus?.Invoke($"SCSI device type: {_dev.ScsiType}."); UpdateStatus?.Invoke($"SCSI medium type: {scsiMediumType}."); UpdateStatus?.Invoke($"SCSI density type: {scsiDensityCode}."); UpdateStatus?.Invoke($"SCSI floppy mode page present: {containsFloppyPage}."); UpdateStatus?.Invoke($"Media identified as {dskType}"); - dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * blockSize); - dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); - dumpLog.WriteLine("Device reports {0} bytes per logical block.", blockSize); - dumpLog.WriteLine("Device reports {0} bytes per physical block.", scsiReader.LongBlockSize); - dumpLog.WriteLine("SCSI device type: {0}.", dev.ScsiType); - dumpLog.WriteLine("SCSI medium type: {0}.", scsiMediumType); - dumpLog.WriteLine("SCSI density type: {0}.", scsiDensityCode); - dumpLog.WriteLine("SCSI floppy mode page present: {0}.", containsFloppyPage); - dumpLog.WriteLine("Media identified as {0}.", dskType); + _dumpLog.WriteLine("Device reports {0} blocks ({1} bytes).", blocks, blocks * blockSize); + _dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); + _dumpLog.WriteLine("Device reports {0} bytes per logical block.", blockSize); + _dumpLog.WriteLine("Device reports {0} bytes per physical block.", scsiReader.LongBlockSize); + _dumpLog.WriteLine("SCSI device type: {0}.", _dev.ScsiType); + _dumpLog.WriteLine("SCSI medium type: {0}.", scsiMediumType); + _dumpLog.WriteLine("SCSI density type: {0}.", scsiDensityCode); + _dumpLog.WriteLine("SCSI floppy mode page present: {0}.", containsFloppyPage); + _dumpLog.WriteLine("Media identified as {0}.", dskType); uint longBlockSize = scsiReader.LongBlockSize; - if(dumpRaw) + if(_dumpRaw) if(blockSize == longBlockSize) { ErrorMessage?.Invoke(!scsiReader.CanReadRaw ? "Device doesn't seem capable of reading raw data from media." : "Device is capable of reading raw data but I've been unable to guess correct sector size."); - if(!force) + if(!_force) { StoppingErrorMessage?. Invoke("Not continuing. If you want to continue reading cooked data when raw is not available use the force option."); @@ -269,24 +269,24 @@ namespace DiscImageChef.Core.Devices.Dumping foreach(MediaTagType tag in mediaTags.Keys) { - if(outputPlugin.SupportedMediaTags.Contains(tag)) + if(_outputPlugin.SupportedMediaTags.Contains(tag)) continue; ret = false; - dumpLog.WriteLine($"Output format does not support {tag}."); + _dumpLog.WriteLine($"Output format does not support {tag}."); ErrorMessage?.Invoke($"Output format does not support {tag}."); } if(!ret) { - if(force) + if(_force) { - dumpLog.WriteLine("Several media tags not supported, continuing..."); + _dumpLog.WriteLine("Several media tags not supported, continuing..."); ErrorMessage?.Invoke("Several media tags not supported, continuing..."); } else { - dumpLog.WriteLine("Several media tags not supported, not continuing..."); + _dumpLog.WriteLine("Several media tags not supported, not continuing..."); StoppingErrorMessage?.Invoke("Several media tags not supported, not continuing..."); return; @@ -294,20 +294,20 @@ namespace DiscImageChef.Core.Devices.Dumping } UpdateStatus?.Invoke($"Reading {blocksToRead} sectors at a time."); - dumpLog.WriteLine("Reading {0} sectors at a time.", blocksToRead); + _dumpLog.WriteLine("Reading {0} sectors at a time.", blocksToRead); - var mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead); - var ibgLog = new IbgLog(outputPrefix + ".ibg", SBC_PROFILE); - ret = outputPlugin.Create(outputPath, dskType, formatOptions, blocks, blockSize); + var mhddLog = new MhddLog(_outputPrefix + ".mhddlog.bin", _dev, blocks, blockSize, blocksToRead); + var ibgLog = new IbgLog(_outputPrefix + ".ibg", SBC_PROFILE); + ret = _outputPlugin.Create(_outputPath, dskType, _formatOptions, blocks, blockSize); // Cannot create image if(!ret) { - dumpLog.WriteLine("Error creating output image, not continuing."); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Error creating output image, not continuing."); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error creating output image, not continuing." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -317,7 +317,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(opticalDisc) { - if(outputPlugin is IWritableOpticalImage opticalPlugin) + if(_outputPlugin is IWritableOpticalImage opticalPlugin) { opticalPlugin.SetTracks(new List { @@ -332,7 +332,7 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - dumpLog.WriteLine("The specified plugin does not support storing optical disc images.."); + _dumpLog.WriteLine("The specified plugin does not support storing optical disc images.."); StoppingErrorMessage?.Invoke("The specified plugin does not support storing optical disc images."); return; @@ -351,15 +351,15 @@ namespace DiscImageChef.Core.Devices.Dumping if(!rigidPage.HasValue || setGeometry) continue; - dumpLog.WriteLine("Setting geometry to {0} cylinders, {1} heads, {2} sectors per track", - rigidPage.Value.Cylinders, rigidPage.Value.Heads, - (uint)(blocks / (rigidPage.Value.Cylinders * rigidPage.Value.Heads))); + _dumpLog.WriteLine("Setting geometry to {0} cylinders, {1} heads, {2} sectors per track", + rigidPage.Value.Cylinders, rigidPage.Value.Heads, + (uint)(blocks / (rigidPage.Value.Cylinders * rigidPage.Value.Heads))); UpdateStatus?. Invoke($"Setting geometry to {rigidPage.Value.Cylinders} cylinders, {rigidPage.Value.Heads} heads, {(uint)(blocks / (rigidPage.Value.Cylinders * rigidPage.Value.Heads))} sectors per track"); - outputPlugin.SetGeometry(rigidPage.Value.Cylinders, rigidPage.Value.Heads, - (uint)(blocks / (rigidPage.Value.Cylinders * rigidPage.Value.Heads))); + _outputPlugin.SetGeometry(rigidPage.Value.Cylinders, rigidPage.Value.Heads, + (uint)(blocks / (rigidPage.Value.Cylinders * rigidPage.Value.Heads))); setGeometry = true; } @@ -371,15 +371,15 @@ namespace DiscImageChef.Core.Devices.Dumping if(!flexiblePage.HasValue) continue; - dumpLog.WriteLine("Setting geometry to {0} cylinders, {1} heads, {2} sectors per track", - flexiblePage.Value.Cylinders, flexiblePage.Value.Heads, - flexiblePage.Value.SectorsPerTrack); + _dumpLog.WriteLine("Setting geometry to {0} cylinders, {1} heads, {2} sectors per track", + flexiblePage.Value.Cylinders, flexiblePage.Value.Heads, + flexiblePage.Value.SectorsPerTrack); UpdateStatus?. Invoke($"Setting geometry to {flexiblePage.Value.Cylinders} cylinders, {flexiblePage.Value.Heads} heads, {flexiblePage.Value.SectorsPerTrack} sectors per track"); - outputPlugin.SetGeometry(flexiblePage.Value.Cylinders, flexiblePage.Value.Heads, - flexiblePage.Value.SectorsPerTrack); + _outputPlugin.SetGeometry(flexiblePage.Value.Cylinders, flexiblePage.Value.Heads, + flexiblePage.Value.SectorsPerTrack); setGeometry = true; } @@ -388,8 +388,8 @@ namespace DiscImageChef.Core.Devices.Dumping DumpHardwareType currentTry = null; ExtentsULong extents = null; - ResumeSupport.Process(true, dev.IsRemovable, blocks, dev.Manufacturer, dev.Model, dev.Serial, - dev.PlatformId, ref resume, ref currentTry, ref extents); + ResumeSupport.Process(true, _dev.IsRemovable, blocks, _dev.Manufacturer, _dev.Model, _dev.Serial, + _dev.PlatformId, ref _resume, ref currentTry, ref extents); if(currentTry == null || extents == null) @@ -399,10 +399,10 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - if(resume.NextBlock > 0) + if(_resume.NextBlock > 0) { - UpdateStatus?.Invoke($"Resuming from block {resume.NextBlock}."); - dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock); + UpdateStatus?.Invoke($"Resuming from block {_resume.NextBlock}."); + _dumpLog.WriteLine("Resuming from block {0}.", _resume.NextBlock); } bool newTrim = false; @@ -410,13 +410,13 @@ namespace DiscImageChef.Core.Devices.Dumping ulong sectorSpeedStart = 0; InitProgress?.Invoke(); - for(ulong i = resume.NextBlock; i < blocks; i += blocksToRead) + for(ulong i = _resume.NextBlock; i < blocks; i += blocksToRead) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -441,49 +441,49 @@ namespace DiscImageChef.Core.Devices.Dumping totalDuration += cmdDuration; if(!sense && - !dev.Error) + !_dev.Error) { mhddLog.Write(i, cmdDuration); ibgLog.Write(i, currentSpeed * 1024); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(readBuffer, i, blocksToRead); + _outputPlugin.WriteSectors(readBuffer, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); } else { // TODO: Reset device after X errors - if(stopOnError) + if(_stopOnError) return; // TODO: Return more cleanly - if(i + skip > blocks) - skip = (uint)(blocks - i); + if(i + _skip > blocks) + _skip = (uint)(blocks - i); // Write empty data DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(new byte[blockSize * skip], i, skip); + _outputPlugin.WriteSectors(new byte[blockSize * _skip], i, _skip); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; - for(ulong b = i; b < i + skip; b++) - resume.BadBlocks.Add(b); + for(ulong b = i; b < i + _skip; b++) + _resume.BadBlocks.Add(b); mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration); ibgLog.Write(i, 0); - dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", skip, i); - i += skip - blocksToRead; + _dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", _skip, i); + i += _skip - blocksToRead; newTrim = true; } - sectorSpeedStart += blocksToRead; - resume.NextBlock = i + blocksToRead; + sectorSpeedStart += blocksToRead; + _resume.NextBlock = i + blocksToRead; double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; if(elapsed < 1) continue; - currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed); + currentSpeed = (sectorSpeedStart * blockSize) / (1048576 * elapsed); sectorSpeedStart = 0; timeSpeedStart = DateTime.UtcNow; } @@ -492,46 +492,46 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); mhddLog.Close(); - ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, - blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000), - devicePath); + ibgLog.Close(_dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, + (blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000), + _devicePath); UpdateStatus?.Invoke($"Dump finished in {(end - start).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average dump speed {(double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000):F3} KiB/sec."); + Invoke($"Average dump speed {((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000):F3} KiB/sec."); UpdateStatus?. - Invoke($"Average write speed {(double)blockSize * (double)(blocks + 1) / 1024 / imageWriteDuration:F3} KiB/sec."); + Invoke($"Average write speed {((double)blockSize * (double)(blocks + 1)) / 1024 / imageWriteDuration:F3} KiB/sec."); - dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); - dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000)); + _dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000)); - dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / imageWriteDuration); + _dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / imageWriteDuration); #region Trimming - if(resume.BadBlocks.Count > 0 && - !aborted && - !notrim && + if(_resume.BadBlocks.Count > 0 && + !_aborted && + !_notrim && newTrim) { start = DateTime.UtcNow; UpdateStatus?.Invoke("Trimming bad sectors"); - dumpLog.WriteLine("Trimming bad sectors"); + _dumpLog.WriteLine("Trimming bad sectors"); - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); InitProgress?.Invoke(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -540,25 +540,25 @@ namespace DiscImageChef.Core.Devices.Dumping sense = scsiReader.ReadBlock(out readBuffer, badSector, out double cmdDuration); - if(sense || dev.Error) + if(sense || _dev.Error) continue; - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); } EndProgress?.Invoke(); end = DateTime.UtcNow; UpdateStatus?.Invoke($"Trimmming finished in {(end - start).TotalSeconds} seconds."); - dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); } #endregion Trimming #region Error handling - if(resume.BadBlocks.Count > 0 && - !aborted && - retryPasses > 0) + if(_resume.BadBlocks.Count > 0 && + !_aborted && + _retryPasses > 0) { int pass = 1; bool forward = true; @@ -568,22 +568,22 @@ namespace DiscImageChef.Core.Devices.Dumping byte[] md6; byte[] md10; - if(persistent) + if(_persistent) { Modes.ModePage_01_MMC pgMmc; Modes.ModePage_01 pg; - sense = dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, - dev.Timeout, out _); + sense = _dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, + _dev.Timeout, out _); if(sense) { - sense = dev.ModeSense10(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, - dev.Timeout, out _); + sense = _dev.ModeSense10(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, + _dev.Timeout, out _); if(!sense) { - Modes.DecodedMode? dcMode10 = Modes.DecodeMode10(readBuffer, dev.ScsiType); + Modes.DecodedMode? dcMode10 = Modes.DecodeMode10(readBuffer, _dev.ScsiType); if(dcMode10.HasValue && dcMode10.Value.Pages != null) @@ -595,7 +595,7 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - Modes.DecodedMode? dcMode6 = Modes.DecodeMode6(readBuffer, dev.ScsiType); + Modes.DecodedMode? dcMode6 = Modes.DecodeMode6(readBuffer, _dev.ScsiType); if(dcMode6.HasValue && dcMode6.Value.Pages != null) @@ -607,7 +607,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(currentModePage == null) { - if(dev.ScsiType == PeripheralDeviceTypes.MultiMediaDevice) + if(_dev.ScsiType == PeripheralDeviceTypes.MultiMediaDevice) { pgMmc = new Modes.ModePage_01_MMC { @@ -635,7 +635,7 @@ namespace DiscImageChef.Core.Devices.Dumping } } - if(dev.ScsiType == PeripheralDeviceTypes.MultiMediaDevice) + if(_dev.ScsiType == PeripheralDeviceTypes.MultiMediaDevice) { pgMmc = new Modes.ModePage_01_MMC { @@ -653,8 +653,8 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); - md10 = Modes.EncodeMode10(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); + md10 = Modes.EncodeMode10(md, _dev.ScsiType); } else { @@ -676,16 +676,16 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); - md10 = Modes.EncodeMode10(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); + md10 = Modes.EncodeMode10(md, _dev.ScsiType); } UpdateStatus?.Invoke("Sending MODE SELECT to drive (return damaged blocks)."); - dumpLog.WriteLine("Sending MODE SELECT to drive (return damaged blocks)."); - sense = dev.ModeSelect(md6, out byte[] senseBuf, true, false, dev.Timeout, out _); + _dumpLog.WriteLine("Sending MODE SELECT to drive (return damaged blocks)."); + sense = _dev.ModeSelect(md6, out byte[] senseBuf, true, false, _dev.Timeout, out _); if(sense) - sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); + sense = _dev.ModeSelect10(md10, out senseBuf, true, false, _dev.Timeout, out _); if(sense) { @@ -694,7 +694,7 @@ namespace DiscImageChef.Core.Devices.Dumping DicConsole.DebugWriteLine("Error: {0}", Sense.PrettifySense(senseBuf)); - dumpLog. + _dumpLog. WriteLine("Drive did not accept MODE SELECT command for persistent error reading, try another drive."); } else @@ -705,15 +705,15 @@ namespace DiscImageChef.Core.Devices.Dumping InitProgress?.Invoke(); repeatRetry: - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -726,28 +726,28 @@ namespace DiscImageChef.Core.Devices.Dumping totalDuration += cmdDuration; if(!sense && - !dev.Error) + !_dev.Error) { - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); UpdateStatus?.Invoke($"Correctly retried block {badSector} in pass {pass}."); - dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); + _dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); } else if(runningPersistent) { - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); } } - if(pass < retryPasses && - !aborted && - resume.BadBlocks.Count > 0) + if(pass < _retryPasses && + !_aborted && + _resume.BadBlocks.Count > 0) { pass++; forward = !forward; - resume.BadBlocks.Sort(); - resume.BadBlocks.Reverse(); + _resume.BadBlocks.Sort(); + _resume.BadBlocks.Reverse(); goto repeatRetry; } @@ -762,22 +762,22 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); - md10 = Modes.EncodeMode10(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); + md10 = Modes.EncodeMode10(md, _dev.ScsiType); UpdateStatus?.Invoke("Sending MODE SELECT to drive (return device to previous status)."); - dumpLog.WriteLine("Sending MODE SELECT to drive (return device to previous status)."); - sense = dev.ModeSelect(md6, out _, true, false, dev.Timeout, out _); + _dumpLog.WriteLine("Sending MODE SELECT to drive (return device to previous status)."); + sense = _dev.ModeSelect(md6, out _, true, false, _dev.Timeout, out _); if(sense) - dev.ModeSelect10(md10, out _, true, false, dev.Timeout, out _); + _dev.ModeSelect10(md10, out _, true, false, _dev.Timeout, out _); } EndProgress?.Invoke(); } #endregion Error handling - if(!aborted) + if(!_aborted) if(opticalDisc) { foreach(KeyValuePair tag in mediaTags) @@ -789,39 +789,39 @@ namespace DiscImageChef.Core.Devices.Dumping continue; } - ret = outputPlugin.WriteMediaTag(tag.Value, tag.Key); + ret = _outputPlugin.WriteMediaTag(tag.Value, tag.Key); - if(ret || force) + if(ret || _force) continue; // Cannot write tag to image StoppingErrorMessage?.Invoke($"Cannot write tag {tag.Key}."); - dumpLog.WriteLine($"Cannot write tag {tag.Key}." + Environment.NewLine + - outputPlugin.ErrorMessage); + _dumpLog.WriteLine($"Cannot write tag {tag.Key}." + Environment.NewLine + + _outputPlugin.ErrorMessage); return; } } else { - if(!dev.IsRemovable || - dev.IsUsb) + if(!_dev.IsRemovable || + _dev.IsUsb) { - if(dev.IsUsb && - dev.UsbDescriptors != null) + if(_dev.IsUsb && + _dev.UsbDescriptors != null) { UpdateStatus?.Invoke("Reading USB descriptors."); - dumpLog.WriteLine("Reading USB descriptors."); - ret = outputPlugin.WriteMediaTag(dev.UsbDescriptors, MediaTagType.USB_Descriptors); + _dumpLog.WriteLine("Reading USB descriptors."); + ret = _outputPlugin.WriteMediaTag(_dev.UsbDescriptors, MediaTagType.USB_Descriptors); if(!ret && - !force) + !_force) { - dumpLog.WriteLine("Cannot write USB descriptors."); + _dumpLog.WriteLine("Cannot write USB descriptors."); StoppingErrorMessage?.Invoke("Cannot write USB descriptors." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -829,110 +829,110 @@ namespace DiscImageChef.Core.Devices.Dumping byte[] cmdBuf; - if(dev.Type == DeviceType.ATAPI) + if(_dev.Type == DeviceType.ATAPI) { UpdateStatus?.Invoke("Requesting ATAPI IDENTIFY PACKET DEVICE."); - dumpLog.WriteLine("Requesting ATAPI IDENTIFY PACKET DEVICE."); - sense = dev.AtapiIdentify(out cmdBuf, out _); + _dumpLog.WriteLine("Requesting ATAPI IDENTIFY PACKET DEVICE."); + sense = _dev.AtapiIdentify(out cmdBuf, out _); if(!sense) { - ret = outputPlugin.WriteMediaTag(cmdBuf, MediaTagType.ATAPI_IDENTIFY); + ret = _outputPlugin.WriteMediaTag(cmdBuf, MediaTagType.ATAPI_IDENTIFY); if(!ret && - !force) + !_force) { - dumpLog.WriteLine("Cannot write ATAPI IDENTIFY PACKET DEVICE."); + _dumpLog.WriteLine("Cannot write ATAPI IDENTIFY PACKET DEVICE."); StoppingErrorMessage?.Invoke("Cannot write ATAPI IDENTIFY PACKET DEVICE." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } } } - sense = dev.ScsiInquiry(out cmdBuf, out _); + sense = _dev.ScsiInquiry(out cmdBuf, out _); if(!sense) { UpdateStatus?.Invoke("Requesting SCSI INQUIRY."); - dumpLog.WriteLine("Requesting SCSI INQUIRY."); - ret = outputPlugin.WriteMediaTag(cmdBuf, MediaTagType.SCSI_INQUIRY); + _dumpLog.WriteLine("Requesting SCSI INQUIRY."); + ret = _outputPlugin.WriteMediaTag(cmdBuf, MediaTagType.SCSI_INQUIRY); if(!ret && - !force) + !_force) { StoppingErrorMessage?.Invoke("Cannot write SCSI INQUIRY."); - dumpLog.WriteLine("Cannot write SCSI INQUIRY." + Environment.NewLine + - outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Cannot write SCSI INQUIRY." + Environment.NewLine + + _outputPlugin.ErrorMessage); return; } UpdateStatus?.Invoke("Requesting MODE SENSE (10)."); - dumpLog.WriteLine("Requesting MODE SENSE (10)."); + _dumpLog.WriteLine("Requesting MODE SENSE (10)."); - sense = dev.ModeSense10(out cmdBuf, out _, false, true, ScsiModeSensePageControl.Current, - 0x3F, 0xFF, 5, out _); + sense = _dev.ModeSense10(out cmdBuf, out _, false, true, ScsiModeSensePageControl.Current, + 0x3F, 0xFF, 5, out _); if(!sense || - dev.Error) - sense = dev.ModeSense10(out cmdBuf, out _, false, true, - ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, out _); + _dev.Error) + sense = _dev.ModeSense10(out cmdBuf, out _, false, true, + ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, out _); decMode = null; if(!sense && - !dev.Error) - if(Modes.DecodeMode10(cmdBuf, dev.ScsiType).HasValue) + !_dev.Error) + if(Modes.DecodeMode10(cmdBuf, _dev.ScsiType).HasValue) { - decMode = Modes.DecodeMode10(cmdBuf, dev.ScsiType); - ret = outputPlugin.WriteMediaTag(cmdBuf, MediaTagType.SCSI_MODESENSE_10); + decMode = Modes.DecodeMode10(cmdBuf, _dev.ScsiType); + ret = _outputPlugin.WriteMediaTag(cmdBuf, MediaTagType.SCSI_MODESENSE_10); if(!ret && - !force) + !_force) { - dumpLog.WriteLine("Cannot write SCSI MODE SENSE (10)."); + _dumpLog.WriteLine("Cannot write SCSI MODE SENSE (10)."); StoppingErrorMessage?.Invoke("Cannot write SCSI MODE SENSE (10)." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } } UpdateStatus?.Invoke("Requesting MODE SENSE (6)."); - dumpLog.WriteLine("Requesting MODE SENSE (6)."); + _dumpLog.WriteLine("Requesting MODE SENSE (6)."); - sense = dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x3F, - 0x00, 5, out _); + sense = _dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x3F, + 0x00, 5, out _); - if(sense || dev.Error) - sense = dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x3F, - 0x00, 5, out _); + if(sense || _dev.Error) + sense = _dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, + 0x3F, 0x00, 5, out _); - if(sense || dev.Error) - sense = dev.ModeSense(out cmdBuf, out _, 5, out _); + if(sense || _dev.Error) + sense = _dev.ModeSense(out cmdBuf, out _, 5, out _); if(!sense && - !dev.Error) - if(Modes.DecodeMode6(cmdBuf, dev.ScsiType).HasValue) + !_dev.Error) + if(Modes.DecodeMode6(cmdBuf, _dev.ScsiType).HasValue) { - decMode = Modes.DecodeMode6(cmdBuf, dev.ScsiType); - ret = outputPlugin.WriteMediaTag(cmdBuf, MediaTagType.SCSI_MODESENSE_6); + decMode = Modes.DecodeMode6(cmdBuf, _dev.ScsiType); + ret = _outputPlugin.WriteMediaTag(cmdBuf, MediaTagType.SCSI_MODESENSE_6); if(!ret && - !force) + !_force) { - dumpLog.WriteLine("Cannot write SCSI MODE SENSE (6)."); + _dumpLog.WriteLine("Cannot write SCSI MODE SENSE (6)."); StoppingErrorMessage?.Invoke("Cannot write SCSI MODE SENSE (6)." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -941,42 +941,42 @@ namespace DiscImageChef.Core.Devices.Dumping } } - resume.BadBlocks.Sort(); + _resume.BadBlocks.Sort(); - foreach(ulong bad in resume.BadBlocks) - dumpLog.WriteLine("Sector {0} could not be read.", bad); + foreach(ulong bad in _resume.BadBlocks) + _dumpLog.WriteLine("Sector {0} could not be read.", bad); currentTry.Extents = ExtentsConverter.ToMetadata(extents); - outputPlugin.SetDumpHardware(resume.Tries); + _outputPlugin.SetDumpHardware(_resume.Tries); - if(preSidecar != null) - outputPlugin.SetCicmMetadata(preSidecar); + if(_preSidecar != null) + _outputPlugin.SetCicmMetadata(_preSidecar); - dumpLog.WriteLine("Closing output file."); + _dumpLog.WriteLine("Closing output file."); UpdateStatus?.Invoke("Closing output file."); DateTime closeStart = DateTime.Now; - outputPlugin.Close(); + _outputPlugin.Close(); DateTime closeEnd = DateTime.Now; UpdateStatus?.Invoke($"Closed in {(closeEnd - closeStart).TotalSeconds} seconds."); - dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); + _dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); - if(aborted) + if(_aborted) { UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); return; } double totalChkDuration = 0; - if(!nometadata) + if(!_nometadata) { UpdateStatus?.Invoke("Creating sidecar."); - dumpLog.WriteLine("Creating sidecar."); + _dumpLog.WriteLine("Creating sidecar."); var filters = new FiltersList(); - IFilter filter = filters.GetFilter(outputPath); + IFilter filter = filters.GetFilter(_outputPath); IMediaImage inputPlugin = ImageFormat.Detect(filter); if(!inputPlugin.Open(filter)) @@ -987,34 +987,34 @@ namespace DiscImageChef.Core.Devices.Dumping } DateTime chkStart = DateTime.UtcNow; - sidecarClass = new Sidecar(inputPlugin, outputPath, filter.Id, encoding); - sidecarClass.InitProgressEvent += InitProgress; - sidecarClass.UpdateProgressEvent += UpdateProgress; - sidecarClass.EndProgressEvent += EndProgress; - sidecarClass.InitProgressEvent2 += InitProgress2; - sidecarClass.UpdateProgressEvent2 += UpdateProgress2; - sidecarClass.EndProgressEvent2 += EndProgress2; - sidecarClass.UpdateStatusEvent += UpdateStatus; - CICMMetadataType sidecar = sidecarClass.Create(); + _sidecarClass = new Sidecar(inputPlugin, _outputPath, filter.Id, _encoding); + _sidecarClass.InitProgressEvent += InitProgress; + _sidecarClass.UpdateProgressEvent += UpdateProgress; + _sidecarClass.EndProgressEvent += EndProgress; + _sidecarClass.InitProgressEvent2 += InitProgress2; + _sidecarClass.UpdateProgressEvent2 += UpdateProgress2; + _sidecarClass.EndProgressEvent2 += EndProgress2; + _sidecarClass.UpdateStatusEvent += UpdateStatus; + CICMMetadataType sidecar = _sidecarClass.Create(); end = DateTime.UtcNow; totalChkDuration = (end - chkStart).TotalMilliseconds; UpdateStatus?.Invoke($"Sidecar created in {(end - chkStart).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average checksum speed {(double)blockSize * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); + Invoke($"Average checksum speed {((double)blockSize * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); - dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); + _dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); - dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000)); + _dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000)); if(opticalDisc) { - if(preSidecar != null) + if(_preSidecar != null) { - preSidecar.OpticalDisc = sidecar.OpticalDisc; - sidecar = preSidecar; + _preSidecar.OpticalDisc = sidecar.OpticalDisc; + sidecar = _preSidecar; } List<(ulong start, string type)> filesystems = new List<(ulong start, string type)>(); @@ -1034,7 +1034,7 @@ namespace DiscImageChef.Core.Devices.Dumping }).Distinct()) { UpdateStatus?.Invoke($"Found filesystem {filesystem.type} at sector {filesystem.start}"); - dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); + _dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); } // TODO: Implement layers @@ -1042,64 +1042,65 @@ namespace DiscImageChef.Core.Devices.Dumping (string type, string subType) xmlType = CommonTypes.Metadata.MediaType.MediaTypeToString(dskType); sidecar.OpticalDisc[0].DiscType = xmlType.type; sidecar.OpticalDisc[0].DiscSubType = xmlType.subType; - sidecar.OpticalDisc[0].DumpHardwareArray = resume.Tries.ToArray(); + sidecar.OpticalDisc[0].DumpHardwareArray = _resume.Tries.ToArray(); foreach(KeyValuePair tag in mediaTags) - if(outputPlugin.SupportedMediaTags.Contains(tag.Key)) - AddMediaTagToSidecar(outputPath, tag, ref sidecar); + if(_outputPlugin.SupportedMediaTags.Contains(tag.Key)) + AddMediaTagToSidecar(_outputPath, tag, ref sidecar); } else { - if(preSidecar != null) + if(_preSidecar != null) { - preSidecar.BlockMedia = sidecar.BlockMedia; - sidecar = preSidecar; + _preSidecar.BlockMedia = sidecar.BlockMedia; + sidecar = _preSidecar; } // All USB flash drives report as removable, even if the media is not removable - if(!dev.IsRemovable || - dev.IsUsb) + if(!_dev.IsRemovable || + _dev.IsUsb) { - if(dev.IsUsb && - dev.UsbDescriptors != null) - if(outputPlugin.SupportedMediaTags.Contains(MediaTagType.USB_Descriptors)) + if(_dev.IsUsb && + _dev.UsbDescriptors != null) + if(_outputPlugin.SupportedMediaTags.Contains(MediaTagType.USB_Descriptors)) sidecar.BlockMedia[0].USB = new USBType { - ProductID = dev.UsbProductId, VendorID = dev.UsbVendorId, Descriptors = new DumpType - { - Image = outputPath, Size = (ulong)dev.UsbDescriptors.Length, - Checksums = Checksum.GetChecksums(dev.UsbDescriptors).ToArray() - } + ProductID = _dev.UsbProductId, VendorID = _dev.UsbVendorId, Descriptors = + new DumpType + { + Image = _outputPath, Size = (ulong)_dev.UsbDescriptors.Length, + Checksums = Checksum.GetChecksums(_dev.UsbDescriptors).ToArray() + } }; byte[] cmdBuf; - if(dev.Type == DeviceType.ATAPI) + if(_dev.Type == DeviceType.ATAPI) { - sense = dev.AtapiIdentify(out cmdBuf, out _); + sense = _dev.AtapiIdentify(out cmdBuf, out _); if(!sense) - if(outputPlugin.SupportedMediaTags.Contains(MediaTagType.ATAPI_IDENTIFY)) + if(_outputPlugin.SupportedMediaTags.Contains(MediaTagType.ATAPI_IDENTIFY)) sidecar.BlockMedia[0].ATA = new ATAType { Identify = new DumpType { - Image = outputPath, Size = (ulong)cmdBuf.Length, + Image = _outputPath, Size = (ulong)cmdBuf.Length, Checksums = Checksum.GetChecksums(cmdBuf).ToArray() } }; } - sense = dev.ScsiInquiry(out cmdBuf, out _); + sense = _dev.ScsiInquiry(out cmdBuf, out _); if(!sense) { - if(outputPlugin.SupportedMediaTags.Contains(MediaTagType.SCSI_INQUIRY)) + if(_outputPlugin.SupportedMediaTags.Contains(MediaTagType.SCSI_INQUIRY)) sidecar.BlockMedia[0].SCSI = new SCSIType { Inquiry = new DumpType { - Image = outputPath, Size = (ulong)cmdBuf.Length, + Image = _outputPath, Size = (ulong)cmdBuf.Length, Checksums = Checksum.GetChecksums(cmdBuf).ToArray() } }; @@ -1139,48 +1140,48 @@ namespace DiscImageChef.Core.Devices.Dumping */ UpdateStatus?.Invoke("Requesting MODE SENSE (10)."); - dumpLog.WriteLine("Requesting MODE SENSE (10)."); + _dumpLog.WriteLine("Requesting MODE SENSE (10)."); - sense = dev.ModeSense10(out cmdBuf, out _, false, true, ScsiModeSensePageControl.Current, - 0x3F, 0xFF, 5, out _); + sense = _dev.ModeSense10(out cmdBuf, out _, false, true, ScsiModeSensePageControl.Current, + 0x3F, 0xFF, 5, out _); if(!sense || - dev.Error) - sense = dev.ModeSense10(out cmdBuf, out _, false, true, - ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, out _); + _dev.Error) + sense = _dev.ModeSense10(out cmdBuf, out _, false, true, + ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, out _); decMode = null; if(!sense && - !dev.Error) - if(Modes.DecodeMode10(cmdBuf, dev.ScsiType).HasValue) - if(outputPlugin.SupportedMediaTags.Contains(MediaTagType.SCSI_MODESENSE_10)) + !_dev.Error) + if(Modes.DecodeMode10(cmdBuf, _dev.ScsiType).HasValue) + if(_outputPlugin.SupportedMediaTags.Contains(MediaTagType.SCSI_MODESENSE_10)) sidecar.BlockMedia[0].SCSI.ModeSense10 = new DumpType { - Image = outputPath, Size = (ulong)cmdBuf.Length, + Image = _outputPath, Size = (ulong)cmdBuf.Length, Checksums = Checksum.GetChecksums(cmdBuf).ToArray() }; UpdateStatus?.Invoke("Requesting MODE SENSE (6)."); - dumpLog.WriteLine("Requesting MODE SENSE (6)."); + _dumpLog.WriteLine("Requesting MODE SENSE (6)."); - sense = dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x3F, - 0x00, 5, out _); + sense = _dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x3F, + 0x00, 5, out _); - if(sense || dev.Error) - sense = dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, 0x3F, - 0x00, 5, out _); + if(sense || _dev.Error) + sense = _dev.ModeSense6(out cmdBuf, out _, false, ScsiModeSensePageControl.Current, + 0x3F, 0x00, 5, out _); - if(sense || dev.Error) - sense = dev.ModeSense(out cmdBuf, out _, 5, out _); + if(sense || _dev.Error) + sense = _dev.ModeSense(out cmdBuf, out _, 5, out _); if(!sense && - !dev.Error) - if(Modes.DecodeMode6(cmdBuf, dev.ScsiType).HasValue) - if(outputPlugin.SupportedMediaTags.Contains(MediaTagType.SCSI_MODESENSE_6)) + !_dev.Error) + if(Modes.DecodeMode6(cmdBuf, _dev.ScsiType).HasValue) + if(_outputPlugin.SupportedMediaTags.Contains(MediaTagType.SCSI_MODESENSE_6)) sidecar.BlockMedia[0].SCSI.ModeSense = new DumpType { - Image = outputPath, Size = (ulong)cmdBuf.Length, + Image = _outputPath, Size = (ulong)cmdBuf.Length, Checksums = Checksum.GetChecksums(cmdBuf).ToArray() }; } @@ -1201,7 +1202,7 @@ namespace DiscImageChef.Core.Devices.Dumping }).Distinct()) { UpdateStatus?.Invoke($"Found filesystem {filesystem.type} at sector {filesystem.start}"); - dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); + _dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); } sidecar.BlockMedia[0].Dimensions = Dimensions.DimensionsFromMediaType(dskType); @@ -1210,13 +1211,13 @@ namespace DiscImageChef.Core.Devices.Dumping sidecar.BlockMedia[0].DiskSubType = xmlType.subType; // TODO: Implement device firmware revision - if(!dev.IsRemovable || - dev.IsUsb) - if(dev.Type == DeviceType.ATAPI) + if(!_dev.IsRemovable || + _dev.IsUsb) + if(_dev.Type == DeviceType.ATAPI) sidecar.BlockMedia[0].Interface = "ATAPI"; - else if(dev.IsUsb) + else if(_dev.IsUsb) sidecar.BlockMedia[0].Interface = "USB"; - else if(dev.IsFireWire) + else if(_dev.IsFireWire) sidecar.BlockMedia[0].Interface = "FireWire"; else sidecar.BlockMedia[0].Interface = "SCSI"; @@ -1224,18 +1225,18 @@ namespace DiscImageChef.Core.Devices.Dumping sidecar.BlockMedia[0].LogicalBlocks = blocks; sidecar.BlockMedia[0].PhysicalBlockSize = physicalBlockSize; sidecar.BlockMedia[0].LogicalBlockSize = logicalBlockSize; - sidecar.BlockMedia[0].Manufacturer = dev.Manufacturer; - sidecar.BlockMedia[0].Model = dev.Model; - sidecar.BlockMedia[0].Serial = dev.Serial; + sidecar.BlockMedia[0].Manufacturer = _dev.Manufacturer; + sidecar.BlockMedia[0].Model = _dev.Model; + sidecar.BlockMedia[0].Serial = _dev.Serial; sidecar.BlockMedia[0].Size = blocks * blockSize; - if(dev.IsRemovable) - sidecar.BlockMedia[0].DumpHardwareArray = resume.Tries.ToArray(); + if(_dev.IsRemovable) + sidecar.BlockMedia[0].DumpHardwareArray = _resume.Tries.ToArray(); } UpdateStatus?.Invoke("Writing metadata sidecar"); - var xmlFs = new FileStream(outputPrefix + ".cicm.xml", FileMode.Create); + var xmlFs = new FileStream(_outputPrefix + ".cicm.xml", FileMode.Create); var xmlSer = new XmlSerializer(typeof(CICMMetadataType)); xmlSer.Serialize(xmlFs, sidecar); @@ -1248,11 +1249,11 @@ namespace DiscImageChef.Core.Devices.Dumping Invoke($"Took a total of {(end - start).TotalSeconds:F3} seconds ({totalDuration / 1000:F3} processing commands, {totalChkDuration / 1000:F3} checksumming, {imageWriteDuration:F3} writing, {(closeEnd - closeStart).TotalSeconds:F3} closing)."); UpdateStatus?. - Invoke($"Average speed: {(double)blockSize * (double)(blocks + 1) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); + Invoke($"Average speed: {((double)blockSize * (double)(blocks + 1)) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); UpdateStatus?.Invoke($"Fastest speed burst: {maxSpeed:F3} MiB/sec."); UpdateStatus?.Invoke($"Slowest speed burst: {minSpeed:F3} MiB/sec."); - UpdateStatus?.Invoke($"{resume.BadBlocks.Count} sectors could not be read."); + UpdateStatus?.Invoke($"{_resume.BadBlocks.Count} sectors could not be read."); UpdateStatus?.Invoke(""); Statistics.AddMedia(dskType, true); diff --git a/DiscImageChef.Core/Devices/Dumping/SCSI.cs b/DiscImageChef.Core/Devices/Dumping/SCSI.cs index 5f8cdade5..0b1e7fae7 100644 --- a/DiscImageChef.Core/Devices/Dumping/SCSI.cs +++ b/DiscImageChef.Core/Devices/Dumping/SCSI.cs @@ -37,59 +37,66 @@ using DiscImageChef.Decoders.SCSI; namespace DiscImageChef.Core.Devices.Dumping { - /// - /// Implements dumping SCSI and ATAPI devices - /// + /// Implements dumping SCSI and ATAPI devices public partial class Dump { // TODO: Get cartridge serial number from Certance vendor EVPD - /// - /// Dumps a SCSI Block Commands device or a Reduced Block Commands devices - /// + /// Dumps a SCSI Block Commands device or a Reduced Block Commands devices public void Scsi() { MediaType dskType = MediaType.Unknown; int resets = 0; - if(dev.IsRemovable) + if(_dev.IsRemovable) { InitProgress?.Invoke(); deviceGotReset: - bool sense = dev.ScsiTestUnitReady(out byte[] senseBuf, dev.Timeout, out _); + bool sense = _dev.ScsiTestUnitReady(out byte[] senseBuf, _dev.Timeout, out _); + if(sense) { FixedSense? decSense = Sense.DecodeFixed(senseBuf); + if(decSense.HasValue) { - ErrorMessage - ?.Invoke($"Device not ready. Sense {decSense.Value.SenseKey} ASC {decSense.Value.ASC:X2}h ASCQ {decSense.Value.ASCQ:X2}h"); - dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", - decSense.Value.SenseKey, decSense.Value.ASC, decSense.Value.ASCQ); + ErrorMessage?. + Invoke($"Device not ready. Sense {decSense.Value.SenseKey} ASC {decSense.Value.ASC:X2}h ASCQ {decSense.Value.ASCQ:X2}h"); + + _dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", + decSense.Value.SenseKey, decSense.Value.ASC, decSense.Value.ASCQ); // Just retry, for 5 times if(decSense.Value.ASC == 0x29) { resets++; - if(resets < 5) goto deviceGotReset; + + if(resets < 5) + goto deviceGotReset; } if(decSense.Value.ASC == 0x3A) { int leftRetries = 5; + while(leftRetries > 0) { PulseProgress?.Invoke("Waiting for drive to become ready"); Thread.Sleep(2000); - sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _); - if(!sense) break; + sense = _dev.ScsiTestUnitReady(out senseBuf, _dev.Timeout, out _); + + if(!sense) + break; decSense = Sense.DecodeFixed(senseBuf); + if(decSense.HasValue) { - ErrorMessage - ?.Invoke($"Device not ready. Sense {decSense.Value.SenseKey} ASC {decSense.Value.ASC:X2}h ASCQ {decSense.Value.ASCQ:X2}h"); - dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", - decSense.Value.SenseKey, decSense.Value.ASC, decSense.Value.ASCQ); + ErrorMessage?. + Invoke($"Device not ready. Sense {decSense.Value.SenseKey} ASC {decSense.Value.ASC:X2}h ASCQ {decSense.Value.ASCQ:X2}h"); + + _dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", + decSense.Value.SenseKey, decSense.Value.ASC, + decSense.Value.ASCQ); } leftRetries--; @@ -98,26 +105,34 @@ namespace DiscImageChef.Core.Devices.Dumping if(sense) { StoppingErrorMessage?.Invoke("Please insert media in drive"); + return; } } - else if(decSense.Value.ASC == 0x04 && decSense.Value.ASCQ == 0x01) + else if(decSense.Value.ASC == 0x04 && + decSense.Value.ASCQ == 0x01) { int leftRetries = 50; + while(leftRetries > 0) { PulseProgress?.Invoke("Waiting for drive to become ready"); Thread.Sleep(2000); - sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _); - if(!sense) break; + sense = _dev.ScsiTestUnitReady(out senseBuf, _dev.Timeout, out _); + + if(!sense) + break; decSense = Sense.DecodeFixed(senseBuf); + if(decSense.HasValue) { - ErrorMessage - ?.Invoke($"Device not ready. Sense {decSense.Value.SenseKey} ASC {decSense.Value.ASC:X2}h ASCQ {decSense.Value.ASCQ:X2}h"); - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", - decSense.Value.SenseKey, decSense.Value.ASC, decSense.Value.ASCQ); + ErrorMessage?. + Invoke($"Device not ready. Sense {decSense.Value.SenseKey} ASC {decSense.Value.ASC:X2}h ASCQ {decSense.Value.ASCQ:X2}h"); + + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", + decSense.Value.SenseKey, decSense.Value.ASC, + decSense.Value.ASCQ); } leftRetries--; @@ -125,8 +140,9 @@ namespace DiscImageChef.Core.Devices.Dumping if(sense) { - StoppingErrorMessage - ?.Invoke($"Error testing unit was ready:\n{Sense.PrettifySense(senseBuf)}"); + StoppingErrorMessage?. + Invoke($"Error testing unit was ready:\n{Sense.PrettifySense(senseBuf)}"); + return; } } @@ -147,20 +163,26 @@ namespace DiscImageChef.Core.Devices.Dumping else if(decSense.Value.ASC == 0x28) { int leftRetries = 10; + while(leftRetries > 0) { PulseProgress?.Invoke("Waiting for drive to become ready"); Thread.Sleep(2000); - sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out _); - if(!sense) break; + sense = _dev.ScsiTestUnitReady(out senseBuf, _dev.Timeout, out _); + + if(!sense) + break; decSense = Sense.DecodeFixed(senseBuf); + if(decSense.HasValue) { - ErrorMessage - ?.Invoke($"Device not ready. Sense {decSense.Value.SenseKey} ASC {decSense.Value.ASC:X2}h ASCQ {decSense.Value.ASCQ:X2}h"); - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", - decSense.Value.SenseKey, decSense.Value.ASC, decSense.Value.ASCQ); + ErrorMessage?. + Invoke($"Device not ready. Sense {decSense.Value.SenseKey} ASC {decSense.Value.ASC:X2}h ASCQ {decSense.Value.ASCQ:X2}h"); + + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", + decSense.Value.SenseKey, decSense.Value.ASC, + decSense.Value.ASCQ); } leftRetries--; @@ -168,21 +190,24 @@ namespace DiscImageChef.Core.Devices.Dumping if(sense) { - StoppingErrorMessage - ?.Invoke($"Error testing unit was ready:\n{Sense.PrettifySense(senseBuf)}"); + StoppingErrorMessage?. + Invoke($"Error testing unit was ready:\n{Sense.PrettifySense(senseBuf)}"); + return; } } else { - StoppingErrorMessage - ?.Invoke($"Error testing unit was ready:\n{Sense.PrettifySense(senseBuf)}"); + StoppingErrorMessage?. + Invoke($"Error testing unit was ready:\n{Sense.PrettifySense(senseBuf)}"); + return; } } else { StoppingErrorMessage?.Invoke("Unknown testing unit was ready."); + return; } } @@ -190,28 +215,34 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); } - switch(dev.ScsiType) + switch(_dev.ScsiType) { case PeripheralDeviceTypes.SequentialAccess: - if(dumpRaw) + if(_dumpRaw) { StoppingErrorMessage?.Invoke("Tapes cannot be dumped raw."); + return; } - if(outputPlugin is IWritableTapeImage) Ssc(); + if(_outputPlugin is IWritableTapeImage) + Ssc(); else - StoppingErrorMessage - ?.Invoke("The specified plugin does not support storing streaming tape images."); + StoppingErrorMessage?. + Invoke("The specified plugin does not support storing streaming tape images."); + return; case PeripheralDeviceTypes.MultiMediaDevice: - if(outputPlugin is IWritableOpticalImage) Mmc(ref dskType); + if(_outputPlugin is IWritableOpticalImage) + Mmc(ref dskType); else - StoppingErrorMessage - ?.Invoke("The specified plugin does not support storing optical disc images."); + StoppingErrorMessage?. + Invoke("The specified plugin does not support storing optical disc images."); + return; default: Sbc(null, ref dskType, false); + break; } } diff --git a/DiscImageChef.Core/Devices/Dumping/SSC.cs b/DiscImageChef.Core/Devices/Dumping/SSC.cs index 4af3ea8cb..a076ad2b9 100644 --- a/DiscImageChef.Core/Devices/Dumping/SSC.cs +++ b/DiscImageChef.Core/Devices/Dumping/SSC.cs @@ -60,7 +60,7 @@ namespace DiscImageChef.Core.Devices.Dumping bool sense; uint blockSize; ulong blocks = 0; - var dskType = MediaType.Unknown; + MediaType dskType = MediaType.Unknown; DateTime start; DateTime end; double totalDuration = 0; @@ -68,7 +68,7 @@ namespace DiscImageChef.Core.Devices.Dumping double maxSpeed = double.MinValue; double minSpeed = double.MaxValue; - dev.RequestSense(out byte[] senseBuf, dev.Timeout, out double duration); + _dev.RequestSense(out byte[] senseBuf, _dev.Timeout, out double duration); fxSense = Sense.DecodeFixed(senseBuf, out string strSense); InitProgress?.Invoke(); @@ -76,8 +76,8 @@ namespace DiscImageChef.Core.Devices.Dumping if(fxSense.HasValue && fxSense?.SenseKey != SenseKeys.NoSense) { - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, - fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, + fxSense?.ASC, fxSense?.ASCQ); StoppingErrorMessage?.Invoke("Drive has status error, please correct. Sense follows..." + Environment.NewLine + strSense); @@ -92,45 +92,45 @@ namespace DiscImageChef.Core.Devices.Dumping fxSense?.ASCQ != 0x04 && fxSense?.SenseKey != SenseKeys.IllegalRequest) { - dumpLog.WriteLine("Rewinding, please wait..."); + _dumpLog.WriteLine("Rewinding, please wait..."); PulseProgress?.Invoke("Rewinding, please wait..."); // Rewind, let timeout apply - dev.Rewind(out senseBuf, dev.Timeout, out duration); + _dev.Rewind(out senseBuf, _dev.Timeout, out duration); // Still rewinding? // TODO: Pause? do { PulseProgress?.Invoke("Rewinding, please wait..."); - dev.RequestSense(out senseBuf, dev.Timeout, out duration); + _dev.RequestSense(out senseBuf, _dev.Timeout, out duration); fxSense = Sense.DecodeFixed(senseBuf, out strSense); } while(fxSense.HasValue && fxSense?.ASC == 0x00 && (fxSense?.ASCQ == 0x1A || fxSense?.ASCQ != 0x04 || fxSense?.ASCQ != 0x00)); - dev.RequestSense(out senseBuf, dev.Timeout, out duration); + _dev.RequestSense(out senseBuf, _dev.Timeout, out duration); fxSense = Sense.DecodeFixed(senseBuf, out strSense); // And yet, did not rewind! if(fxSense.HasValue && - (fxSense?.ASC == 0x00 && fxSense?.ASCQ != 0x04 && fxSense?.ASCQ != 0x00 || fxSense?.ASC != 0x00)) + ((fxSense?.ASC == 0x00 && fxSense?.ASCQ != 0x04 && fxSense?.ASCQ != 0x00) || fxSense?.ASC != 0x00)) { StoppingErrorMessage?.Invoke("Drive could not rewind, please correct. Sense follows..." + Environment.NewLine + strSense); - dumpLog.WriteLine("Drive could not rewind, please correct. Sense follows..."); + _dumpLog.WriteLine("Drive could not rewind, please correct. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, - fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, + fxSense?.ASC, fxSense?.ASCQ); return; } } // Check position - sense = dev.ReadPosition(out byte[] cmdBuf, out senseBuf, SscPositionForms.Short, dev.Timeout, - out duration); + sense = _dev.ReadPosition(out byte[] cmdBuf, out senseBuf, SscPositionForms.Short, _dev.Timeout, + out duration); if(sense) { @@ -139,16 +139,16 @@ namespace DiscImageChef.Core.Devices.Dumping fxSense = Sense.DecodeFixed(senseBuf, out strSense); if(fxSense.HasValue && - (fxSense?.ASC == 0x20 && fxSense?.ASCQ != 0x00 || - fxSense?.ASC != 0x20 && fxSense?.SenseKey != SenseKeys.IllegalRequest)) + ((fxSense?.ASC == 0x20 && fxSense?.ASCQ != 0x00) || + (fxSense?.ASC != 0x20 && fxSense?.SenseKey != SenseKeys.IllegalRequest))) { StoppingErrorMessage?.Invoke("Could not get position. Sense follows..." + Environment.NewLine + strSense); - dumpLog.WriteLine("Could not get position. Sense follows..."); + _dumpLog.WriteLine("Could not get position. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, - fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, + fxSense?.ASC, fxSense?.ASCQ); return; } @@ -159,10 +159,10 @@ namespace DiscImageChef.Core.Devices.Dumping if(cmdBuf[1] != 0) { UpdateStatus?.Invoke("Drive not in partition 0. Rewinding, please wait..."); - dumpLog.WriteLine("Drive not in partition 0. Rewinding, please wait..."); + _dumpLog.WriteLine("Drive not in partition 0. Rewinding, please wait..."); // Rewind, let timeout apply - sense = dev.Locate(out senseBuf, false, 0, 0, dev.Timeout, out duration); + sense = _dev.Locate(out senseBuf, false, 0, 0, _dev.Timeout, out duration); if(sense) { @@ -170,10 +170,10 @@ namespace DiscImageChef.Core.Devices.Dumping Environment.NewLine + strSense); - dumpLog.WriteLine("Drive could not rewind, please correct. Sense follows..."); + _dumpLog.WriteLine("Drive could not rewind, please correct. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, - fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, + fxSense?.ASC, fxSense?.ASCQ); return; } @@ -184,7 +184,7 @@ namespace DiscImageChef.Core.Devices.Dumping { Thread.Sleep(1000); PulseProgress?.Invoke("Rewinding, please wait..."); - dev.RequestSense(out senseBuf, dev.Timeout, out duration); + _dev.RequestSense(out senseBuf, _dev.Timeout, out duration); fxSense = Sense.DecodeFixed(senseBuf, out strSense); } while(fxSense.HasValue && fxSense?.ASC == 0x00 && @@ -192,22 +192,23 @@ namespace DiscImageChef.Core.Devices.Dumping // And yet, did not rewind! if(fxSense.HasValue && - (fxSense?.ASC == 0x00 && fxSense?.ASCQ != 0x04 && fxSense?.ASCQ != 0x00 || fxSense?.ASC != 0x00)) + ((fxSense?.ASC == 0x00 && fxSense?.ASCQ != 0x04 && fxSense?.ASCQ != 0x00) || + fxSense?.ASC != 0x00)) { StoppingErrorMessage?.Invoke("Drive could not rewind, please correct. Sense follows..." + Environment.NewLine + strSense); - dumpLog.WriteLine("Drive could not rewind, please correct. Sense follows..."); + _dumpLog.WriteLine("Drive could not rewind, please correct. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, - fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, + fxSense?.ASC, fxSense?.ASCQ); return; } - sense = dev.ReadPosition(out cmdBuf, out senseBuf, SscPositionForms.Short, dev.Timeout, - out duration); + sense = _dev.ReadPosition(out cmdBuf, out senseBuf, SscPositionForms.Short, _dev.Timeout, + out duration); if(sense) { @@ -217,10 +218,10 @@ namespace DiscImageChef.Core.Devices.Dumping Environment.NewLine + strSense); - dumpLog.WriteLine("Drive could not rewind, please correct. Sense follows..."); + _dumpLog.WriteLine("Drive could not rewind, please correct. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, - fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, + fxSense?.ASC, fxSense?.ASCQ); return; } @@ -229,7 +230,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(cmdBuf[1] != 0) { StoppingErrorMessage?.Invoke("Drive could not rewind to partition 0 but no error occurred..."); - dumpLog.WriteLine("Drive could not rewind to partition 0 but no error occurred..."); + _dumpLog.WriteLine("Drive could not rewind to partition 0 but no error occurred..."); return; } @@ -245,37 +246,37 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke("Requesting MODE SENSE (10)."); - sense = dev.ModeSense10(out cmdBuf, out senseBuf, false, true, ScsiModeSensePageControl.Current, 0x3F, 0xFF, - 5, out duration); + sense = _dev.ModeSense10(out cmdBuf, out senseBuf, false, true, ScsiModeSensePageControl.Current, 0x3F, + 0xFF, 5, out duration); if(!sense || - dev.Error) - sense = dev.ModeSense10(out cmdBuf, out senseBuf, false, true, ScsiModeSensePageControl.Current, 0x3F, - 0x00, 5, out duration); + _dev.Error) + sense = _dev.ModeSense10(out cmdBuf, out senseBuf, false, true, ScsiModeSensePageControl.Current, 0x3F, + 0x00, 5, out duration); Modes.DecodedMode? decMode = null; if(!sense && - !dev.Error) - if(Modes.DecodeMode10(cmdBuf, dev.ScsiType).HasValue) - decMode = Modes.DecodeMode10(cmdBuf, dev.ScsiType); + !_dev.Error) + if(Modes.DecodeMode10(cmdBuf, _dev.ScsiType).HasValue) + decMode = Modes.DecodeMode10(cmdBuf, _dev.ScsiType); UpdateStatus?.Invoke("Requesting MODE SENSE (6)."); - sense = dev.ModeSense6(out cmdBuf, out senseBuf, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, - out duration); + sense = _dev.ModeSense6(out cmdBuf, out senseBuf, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, + out duration); - if(sense || dev.Error) - sense = dev.ModeSense6(out cmdBuf, out senseBuf, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, 5, - out duration); + if(sense || _dev.Error) + sense = _dev.ModeSense6(out cmdBuf, out senseBuf, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, + 5, out duration); - if(sense || dev.Error) - sense = dev.ModeSense(out cmdBuf, out senseBuf, 5, out duration); + if(sense || _dev.Error) + sense = _dev.ModeSense(out cmdBuf, out senseBuf, 5, out duration); if(!sense && - !dev.Error) - if(Modes.DecodeMode6(cmdBuf, dev.ScsiType).HasValue) - decMode = Modes.DecodeMode6(cmdBuf, dev.ScsiType); + !_dev.Error) + if(Modes.DecodeMode6(cmdBuf, _dev.ScsiType).HasValue) + decMode = Modes.DecodeMode6(cmdBuf, _dev.ScsiType); // TODO: Check partitions page if(decMode.HasValue) @@ -293,7 +294,7 @@ namespace DiscImageChef.Core.Devices.Dumping else blockSize = 1; - if(!dev.ReadBlockLimits(out cmdBuf, out senseBuf, dev.Timeout, out _)) + if(!_dev.ReadBlockLimits(out cmdBuf, out senseBuf, _dev.Timeout, out _)) { BlockLimits.BlockLimitsData? blockLimits = BlockLimits.Decode(cmdBuf); @@ -308,21 +309,21 @@ namespace DiscImageChef.Core.Devices.Dumping blockSize = 1; if(dskType == MediaType.Unknown) - dskType = MediaTypeFromScsi.Get((byte)dev.ScsiType, dev.Manufacturer, dev.Model, scsiMediumTypeTape, + dskType = MediaTypeFromScsi.Get((byte)_dev.ScsiType, _dev.Manufacturer, _dev.Model, scsiMediumTypeTape, scsiDensityCodeTape, blocks, blockSize); if(dskType == MediaType.Unknown) dskType = MediaType.UnknownTape; - UpdateStatus?.Invoke($"SCSI device type: {dev.ScsiType}."); + UpdateStatus?.Invoke($"SCSI device type: {_dev.ScsiType}."); UpdateStatus?.Invoke($"SCSI medium type: {scsiMediumTypeTape}."); UpdateStatus?.Invoke($"SCSI density type: {scsiDensityCodeTape}."); UpdateStatus?.Invoke($"Media identified as {dskType}."); - dumpLog.WriteLine("SCSI device type: {0}.", dev.ScsiType); - dumpLog.WriteLine("SCSI medium type: {0}.", scsiMediumTypeTape); - dumpLog.WriteLine("SCSI density type: {0}.", scsiDensityCodeTape); - dumpLog.WriteLine("Media identified as {0}.", dskType); + _dumpLog.WriteLine("SCSI device type: {0}.", _dev.ScsiType); + _dumpLog.WriteLine("SCSI medium type: {0}.", scsiMediumTypeTape); + _dumpLog.WriteLine("SCSI density type: {0}.", scsiDensityCodeTape); + _dumpLog.WriteLine("Media identified as {0}.", dskType); bool endOfMedia = false; ulong currentBlock = 0; @@ -334,8 +335,8 @@ namespace DiscImageChef.Core.Devices.Dumping firstRead: - sense = dev.Read6(out cmdBuf, out senseBuf, false, fixedLen, transferLen, blockSize, dev.Timeout, - out duration); + sense = _dev.Read6(out cmdBuf, out senseBuf, false, fixedLen, transferLen, blockSize, _dev.Timeout, + out duration); if(sense) { @@ -344,7 +345,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(fxSense.HasValue) if(fxSense?.SenseKey == SenseKeys.IllegalRequest) { - sense = dev.Space(out senseBuf, SscSpaceCodes.LogicalBlock, -1, dev.Timeout, out duration); + sense = _dev.Space(out senseBuf, SscSpaceCodes.LogicalBlock, -1, _dev.Timeout, out duration); if(sense) { @@ -357,10 +358,10 @@ namespace DiscImageChef.Core.Devices.Dumping Environment.NewLine + strSense); - dumpLog.WriteLine("Drive could not return back. Sense follows..."); + _dumpLog.WriteLine("Drive could not return back. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", - fxSense?.SenseKey, fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", + fxSense?.SenseKey, fxSense?.ASC, fxSense?.ASCQ); return; } @@ -369,8 +370,8 @@ namespace DiscImageChef.Core.Devices.Dumping fixedLen = true; transferLen = 1; - sense = dev.Read6(out cmdBuf, out senseBuf, false, fixedLen, transferLen, blockSize, - dev.Timeout, out duration); + sense = _dev.Read6(out cmdBuf, out senseBuf, false, fixedLen, transferLen, blockSize, + _dev.Timeout, out duration); if(sense) { @@ -379,10 +380,10 @@ namespace DiscImageChef.Core.Devices.Dumping StoppingErrorMessage?.Invoke("Drive could not read. Sense follows..." + Environment.NewLine + strSense); - dumpLog.WriteLine("Drive could not read. Sense follows..."); + _dumpLog.WriteLine("Drive could not read. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, - fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", + fxSense?.SenseKey, fxSense?.ASC, fxSense?.ASCQ); return; } @@ -398,9 +399,9 @@ namespace DiscImageChef.Core.Devices.Dumping transferLen = blockSize; UpdateStatus?.Invoke($"Blocksize changed to {blockSize} bytes at block {currentBlock}"); - dumpLog.WriteLine("Blocksize changed to {0} bytes at block {1}", blockSize, currentBlock); + _dumpLog.WriteLine("Blocksize changed to {0} bytes at block {1}", blockSize, currentBlock); - sense = dev.Space(out senseBuf, SscSpaceCodes.LogicalBlock, -1, dev.Timeout, out duration); + sense = _dev.Space(out senseBuf, SscSpaceCodes.LogicalBlock, -1, _dev.Timeout, out duration); totalDuration += duration; @@ -412,10 +413,10 @@ namespace DiscImageChef.Core.Devices.Dumping Environment.NewLine + strSense); - dumpLog.WriteLine("Drive could not go back one block. Sense follows..."); + _dumpLog.WriteLine("Drive could not go back one block. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", - fxSense?.SenseKey, fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", + fxSense?.SenseKey, fxSense?.ASC, fxSense?.ASCQ); return; } @@ -427,23 +428,23 @@ namespace DiscImageChef.Core.Devices.Dumping StoppingErrorMessage?.Invoke("Drive could not read. Sense follows..." + Environment.NewLine + strSense); - dumpLog.WriteLine("Drive could not read. Sense follows..."); + _dumpLog.WriteLine("Drive could not read. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, - fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, + fxSense?.ASC, fxSense?.ASCQ); return; } else { StoppingErrorMessage?.Invoke("Cannot read device, don't know why, exiting..."); - dumpLog.WriteLine("Cannot read device, don't know why, exiting..."); + _dumpLog.WriteLine("Cannot read device, don't know why, exiting..."); return; } } - sense = dev.Space(out senseBuf, SscSpaceCodes.LogicalBlock, -1, dev.Timeout, out duration); + sense = _dev.Space(out senseBuf, SscSpaceCodes.LogicalBlock, -1, _dev.Timeout, out duration); if(sense) { @@ -455,10 +456,10 @@ namespace DiscImageChef.Core.Devices.Dumping StoppingErrorMessage?.Invoke("Drive could not return back. Sense follows..." + Environment.NewLine + strSense); - dumpLog.WriteLine("Drive could not return back. Sense follows..."); + _dumpLog.WriteLine("Drive could not return back. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, - fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0} ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, + fxSense?.ASC, fxSense?.ASCQ); return; } @@ -467,8 +468,8 @@ namespace DiscImageChef.Core.Devices.Dumping DumpHardwareType currentTry = null; ExtentsULong extents = null; - ResumeSupport.Process(true, dev.IsRemovable, blocks, dev.Manufacturer, dev.Model, dev.Serial, - dev.PlatformId, ref resume, ref currentTry, ref extents, true); + ResumeSupport.Process(true, _dev.IsRemovable, blocks, _dev.Manufacturer, _dev.Model, _dev.Serial, + _dev.PlatformId, ref _resume, ref currentTry, ref extents, true); if(currentTry == null || extents == null) @@ -482,13 +483,13 @@ namespace DiscImageChef.Core.Devices.Dumping bool canLocate = false; UpdateStatus?.Invoke("Positioning tape to block 1."); - dumpLog.WriteLine("Positioning tape to block 1"); + _dumpLog.WriteLine("Positioning tape to block 1"); - sense = dev.Locate16(out senseBuf, 1, dev.Timeout, out _); + sense = _dev.Locate16(out senseBuf, 1, _dev.Timeout, out _); if(!sense) { - sense = dev.ReadPositionLong(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadPositionLong(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(!sense) { @@ -498,7 +499,7 @@ namespace DiscImageChef.Core.Devices.Dumping { canLocateLong = true; UpdateStatus?.Invoke("LOCATE LONG works."); - dumpLog.WriteLine("LOCATE LONG works."); + _dumpLog.WriteLine("LOCATE LONG works."); } } else @@ -507,11 +508,11 @@ namespace DiscImageChef.Core.Devices.Dumping else fxSense = Sense.DecodeFixed(senseBuf, out strSense); - sense = dev.Locate(out senseBuf, 1, dev.Timeout, out _); + sense = _dev.Locate(out senseBuf, 1, _dev.Timeout, out _); if(!sense) { - sense = dev.ReadPosition(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadPosition(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(!sense) { @@ -521,7 +522,7 @@ namespace DiscImageChef.Core.Devices.Dumping { canLocate = true; UpdateStatus?.Invoke("LOCATE works."); - dumpLog.WriteLine("LOCATE works."); + _dumpLog.WriteLine("LOCATE works."); } } else @@ -530,24 +531,24 @@ namespace DiscImageChef.Core.Devices.Dumping else fxSense = Sense.DecodeFixed(senseBuf, out strSense); - if(resume.NextBlock > 0) + if(_resume.NextBlock > 0) { - UpdateStatus?.Invoke($"Positioning tape to block {resume.NextBlock}."); - dumpLog.WriteLine("Positioning tape to block {0}.", resume.NextBlock); + UpdateStatus?.Invoke($"Positioning tape to block {_resume.NextBlock}."); + _dumpLog.WriteLine("Positioning tape to block {0}.", _resume.NextBlock); if(canLocateLong) { - sense = dev.Locate16(out senseBuf, resume.NextBlock, dev.Timeout, out _); + sense = _dev.Locate16(out senseBuf, _resume.NextBlock, _dev.Timeout, out _); if(!sense) { - sense = dev.ReadPositionLong(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadPositionLong(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(sense) { - if(!force) + if(!_force) { - dumpLog. + _dumpLog. WriteLine("Could not check current position, unable to resume. If you want to continue use force."); StoppingErrorMessage?. @@ -556,7 +557,7 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - dumpLog. + _dumpLog. WriteLine("Could not check current position, unable to resume. Dumping from the start."); ErrorMessage?. @@ -568,11 +569,11 @@ namespace DiscImageChef.Core.Devices.Dumping { ulong position = Swapping.Swap(BitConverter.ToUInt64(cmdBuf, 8)); - if(position != resume.NextBlock) + if(position != _resume.NextBlock) { - if(!force) + if(!_force) { - dumpLog. + _dumpLog. WriteLine("Current position is not as expected, unable to resume. If you want to continue use force."); StoppingErrorMessage?. @@ -581,7 +582,7 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - dumpLog. + _dumpLog. WriteLine("Current position is not as expected, unable to resume. Dumping from the start."); ErrorMessage?. @@ -593,9 +594,9 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - if(!force) + if(!_force) { - dumpLog. + _dumpLog. WriteLine("Cannot reposition tape, unable to resume. If you want to continue use force."); StoppingErrorMessage?. @@ -604,24 +605,24 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - dumpLog.WriteLine("Cannot reposition tape, unable to resume. Dumping from the start."); + _dumpLog.WriteLine("Cannot reposition tape, unable to resume. Dumping from the start."); ErrorMessage?.Invoke("Cannot reposition tape, unable to resume. Dumping from the start."); canLocateLong = false; } } else if(canLocate) { - sense = dev.Locate(out senseBuf, (uint)resume.NextBlock, dev.Timeout, out _); + sense = _dev.Locate(out senseBuf, (uint)_resume.NextBlock, _dev.Timeout, out _); if(!sense) { - sense = dev.ReadPosition(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadPosition(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(sense) { - if(!force) + if(!_force) { - dumpLog. + _dumpLog. WriteLine("Could not check current position, unable to resume. If you want to continue use force."); StoppingErrorMessage?. @@ -630,7 +631,7 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - dumpLog. + _dumpLog. WriteLine("Could not check current position, unable to resume. Dumping from the start."); ErrorMessage?. @@ -642,11 +643,11 @@ namespace DiscImageChef.Core.Devices.Dumping { ulong position = Swapping.Swap(BitConverter.ToUInt32(cmdBuf, 4)); - if(position != resume.NextBlock) + if(position != _resume.NextBlock) { - if(!force) + if(!_force) { - dumpLog. + _dumpLog. WriteLine("Current position is not as expected, unable to resume. If you want to continue use force."); StoppingErrorMessage?. @@ -655,7 +656,7 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - dumpLog. + _dumpLog. WriteLine("Current position is not as expected, unable to resume. Dumping from the start."); ErrorMessage?. @@ -667,9 +668,9 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - if(!force) + if(!_force) { - dumpLog. + _dumpLog. WriteLine("Cannot reposition tape, unable to resume. If you want to continue use force."); StoppingErrorMessage?. @@ -678,16 +679,16 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - dumpLog.WriteLine("Cannot reposition tape, unable to resume. Dumping from the start."); + _dumpLog.WriteLine("Cannot reposition tape, unable to resume. Dumping from the start."); ErrorMessage?.Invoke("Cannot reposition tape, unable to resume. Dumping from the start."); canLocate = false; } } else { - if(!force) + if(!_force) { - dumpLog. + _dumpLog. WriteLine("Cannot reposition tape, unable to resume. If you want to continue use force."); StoppingErrorMessage?. @@ -696,21 +697,21 @@ namespace DiscImageChef.Core.Devices.Dumping return; } - dumpLog.WriteLine("Cannot reposition tape, unable to resume. Dumping from the start."); + _dumpLog.WriteLine("Cannot reposition tape, unable to resume. Dumping from the start."); ErrorMessage?.Invoke("Cannot reposition tape, unable to resume. Dumping from the start."); canLocate = false; } } else { - sense = canLocateLong ? dev.Locate16(out senseBuf, false, 0, 0, dev.Timeout, out duration) - : dev.Locate(out senseBuf, false, 0, 0, dev.Timeout, out duration); + sense = canLocateLong ? _dev.Locate16(out senseBuf, false, 0, 0, _dev.Timeout, out duration) + : _dev.Locate(out senseBuf, false, 0, 0, _dev.Timeout, out duration); do { Thread.Sleep(1000); PulseProgress?.Invoke("Rewinding, please wait..."); - dev.RequestSense(out senseBuf, dev.Timeout, out duration); + _dev.RequestSense(out senseBuf, _dev.Timeout, out duration); fxSense = Sense.DecodeFixed(senseBuf, out strSense); } while(fxSense.HasValue && fxSense?.ASC == 0x00 && @@ -718,52 +719,52 @@ namespace DiscImageChef.Core.Devices.Dumping // And yet, did not rewind! if(fxSense.HasValue && - (fxSense?.ASC == 0x00 && fxSense?.ASCQ != 0x00 && fxSense?.ASCQ != 0x04 || fxSense?.ASC != 0x00)) + ((fxSense?.ASC == 0x00 && fxSense?.ASCQ != 0x00 && fxSense?.ASCQ != 0x04) || fxSense?.ASC != 0x00)) { StoppingErrorMessage?.Invoke("Drive could not rewind, please correct. Sense follows..." + Environment.NewLine + strSense); - dumpLog.WriteLine("Drive could not rewind, please correct. Sense follows..."); + _dumpLog.WriteLine("Drive could not rewind, please correct. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, - fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, + fxSense?.ASC, fxSense?.ASCQ); return; } } - bool ret = (outputPlugin as IWritableTapeImage).SetTape(); + bool ret = (_outputPlugin as IWritableTapeImage).SetTape(); // Cannot set image to tape mode if(!ret) { - dumpLog.WriteLine("Error setting output image in tape mode, not continuing."); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Error setting output image in tape mode, not continuing."); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error setting output image in tape mode, not continuing." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } - ret = outputPlugin.Create(outputPath, dskType, formatOptions, 0, 0); + ret = _outputPlugin.Create(_outputPath, dskType, _formatOptions, 0, 0); // Cannot create image if(!ret) { - dumpLog.WriteLine("Error creating output image, not continuing."); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Error creating output image, not continuing."); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error creating output image, not continuing." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } start = DateTime.UtcNow; - var mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, 1); - var ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0008); + var mhddLog = new MhddLog(_outputPrefix + ".mhddlog.bin", _dev, blocks, blockSize, 1); + var ibgLog = new IbgLog(_outputPrefix + ".ibg", 0x0008); var currentTapeFile = new TapeFile { @@ -776,28 +777,28 @@ namespace DiscImageChef.Core.Devices.Dumping }; if((canLocate || canLocateLong) && - resume.NextBlock > 0) + _resume.NextBlock > 0) { - currentBlock = resume.NextBlock; + currentBlock = _resume.NextBlock; currentTapeFile = - (outputPlugin as IWritableTapeImage).Files.FirstOrDefault(f => f.LastBlock == - (outputPlugin as IWritableTapeImage)? - .Files.Max(g => g.LastBlock)); + (_outputPlugin as IWritableTapeImage).Files.FirstOrDefault(f => f.LastBlock == + (_outputPlugin as IWritableTapeImage + )?.Files.Max(g => g.LastBlock)); currentTapePartition = - (outputPlugin as IWritableTapeImage).TapePartitions.FirstOrDefault(p => p.LastBlock == - (outputPlugin as - IWritableTapeImage)?. - TapePartitions. - Max(g => g.LastBlock)); + (_outputPlugin as IWritableTapeImage).TapePartitions.FirstOrDefault(p => p.LastBlock == + (_outputPlugin as + IWritableTapeImage)?. + TapePartitions. + Max(g => g.LastBlock)); } if(mode6Data != null) - outputPlugin.WriteMediaTag(mode6Data, MediaTagType.SCSI_MODESENSE_6); + _outputPlugin.WriteMediaTag(mode6Data, MediaTagType.SCSI_MODESENSE_6); if(mode10Data != null) - outputPlugin.WriteMediaTag(mode10Data, MediaTagType.SCSI_MODESENSE_10); + _outputPlugin.WriteMediaTag(mode10Data, MediaTagType.SCSI_MODESENSE_10); DateTime timeSpeedStart = DateTime.UtcNow; ulong currentSpeedSize = 0; @@ -807,11 +808,11 @@ namespace DiscImageChef.Core.Devices.Dumping while(currentPartition < totalPartitions) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -819,15 +820,15 @@ namespace DiscImageChef.Core.Devices.Dumping if(endOfMedia) { UpdateStatus?.Invoke($"Finished partition {currentPartition}"); - dumpLog.WriteLine("Finished partition {0}", currentPartition); + _dumpLog.WriteLine("Finished partition {0}", currentPartition); currentTapeFile.LastBlock = currentBlock - 1; if(currentTapeFile.LastBlock > currentTapeFile.FirstBlock) - (outputPlugin as IWritableTapeImage).AddFile(currentTapeFile); + (_outputPlugin as IWritableTapeImage).AddFile(currentTapeFile); currentTapePartition.LastBlock = currentBlock - 1; - (outputPlugin as IWritableTapeImage).AddPartition(currentTapePartition); + (_outputPlugin as IWritableTapeImage).AddPartition(currentTapePartition); currentPartition++; @@ -846,7 +847,7 @@ namespace DiscImageChef.Core.Devices.Dumping }; UpdateStatus?.Invoke($"Seeking to partition {currentPartition}"); - dev.Locate(out senseBuf, false, currentPartition, 0, dev.Timeout, out duration); + _dev.Locate(out senseBuf, false, currentPartition, 0, _dev.Timeout, out duration); totalDuration += duration; } @@ -865,8 +866,8 @@ namespace DiscImageChef.Core.Devices.Dumping PulseProgress?.Invoke($"Reading block {currentBlock} ({currentSpeed:F3} MiB/sec.)"); - sense = dev.Read6(out cmdBuf, out senseBuf, false, fixedLen, transferLen, blockSize, dev.Timeout, - out duration); + sense = _dev.Read6(out cmdBuf, out senseBuf, false, fixedLen, transferLen, blockSize, _dev.Timeout, + out duration); totalDuration += duration; @@ -888,9 +889,9 @@ namespace DiscImageChef.Core.Devices.Dumping transferLen = blockSize; UpdateStatus?.Invoke($"Blocksize changed to {blockSize} bytes at block {currentBlock}"); - dumpLog.WriteLine("Blocksize changed to {0} bytes at block {1}", blockSize, currentBlock); + _dumpLog.WriteLine("Blocksize changed to {0} bytes at block {1}", blockSize, currentBlock); - sense = dev.Space(out senseBuf, SscSpaceCodes.LogicalBlock, -1, dev.Timeout, out duration); + sense = _dev.Space(out senseBuf, SscSpaceCodes.LogicalBlock, -1, _dev.Timeout, out duration); totalDuration += duration; @@ -902,11 +903,11 @@ namespace DiscImageChef.Core.Devices.Dumping Environment.NewLine + strSense); - outputPlugin.Close(); - dumpLog.WriteLine("Drive could not go back one block. Sense follows..."); + _outputPlugin.Close(); + _dumpLog.WriteLine("Drive could not go back one block. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", - fxSense?.SenseKey, fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", + fxSense?.SenseKey, fxSense?.ASC, fxSense?.ASCQ); return; } @@ -918,8 +919,8 @@ namespace DiscImageChef.Core.Devices.Dumping { case SenseKeys.BlankCheck when currentBlock == 0: StoppingErrorMessage?.Invoke("Cannot dump a blank tape..."); - outputPlugin.Close(); - dumpLog.WriteLine("Cannot dump a blank tape..."); + _outputPlugin.Close(); + _dumpLog.WriteLine("Cannot dump a blank tape..."); return; @@ -930,13 +931,13 @@ namespace DiscImageChef.Core.Devices.Dumping // TODO: Detect end of partition endOfMedia = true; UpdateStatus?.Invoke("Found end-of-tape/partition..."); - dumpLog.WriteLine("Found end-of-tape/partition..."); + _dumpLog.WriteLine("Found end-of-tape/partition..."); continue; case SenseKeys.BlankCheck: StoppingErrorMessage?.Invoke("Blank block found, end of tape?..."); endOfMedia = true; - dumpLog.WriteLine("Blank block found, end of tape?..."); + _dumpLog.WriteLine("Blank block found, end of tape?..."); continue; } @@ -948,7 +949,7 @@ namespace DiscImageChef.Core.Devices.Dumping // TODO: Detect end of partition endOfMedia = true; UpdateStatus?.Invoke("Found end-of-tape/partition..."); - dumpLog.WriteLine("Found end-of-tape/partition..."); + _dumpLog.WriteLine("Found end-of-tape/partition..."); continue; } @@ -957,7 +958,7 @@ namespace DiscImageChef.Core.Devices.Dumping (fxSense?.ASCQ == 0x01 || fxSense?.Filemark == true)) { currentTapeFile.LastBlock = currentBlock - 1; - (outputPlugin as IWritableTapeImage).AddFile(currentTapeFile); + (_outputPlugin as IWritableTapeImage).AddFile(currentTapeFile); currentFile++; @@ -967,7 +968,7 @@ namespace DiscImageChef.Core.Devices.Dumping }; UpdateStatus?.Invoke($"Changed to file {currentFile} at block {currentBlock}"); - dumpLog.WriteLine("Changed to file {0} at block {1}", currentFile, currentBlock); + _dumpLog.WriteLine("Changed to file {0} at block {1}", currentFile, currentBlock); continue; } @@ -977,45 +978,45 @@ namespace DiscImageChef.Core.Devices.Dumping StoppingErrorMessage?. Invoke($"Drive could not read block ${currentBlock}. Sense cannot be decoded, look at log for dump..."); - dumpLog.WriteLine($"Drive could not read block ${currentBlock}. Sense bytes follow..."); - dumpLog.WriteLine(PrintHex.ByteArrayToHexArrayString(senseBuf, 32)); + _dumpLog.WriteLine($"Drive could not read block ${currentBlock}. Sense bytes follow..."); + _dumpLog.WriteLine(PrintHex.ByteArrayToHexArrayString(senseBuf, 32)); } else { StoppingErrorMessage?. Invoke($"Drive could not read block ${currentBlock}. Sense follows...\n{fxSense?.SenseKey} {strSense}"); - dumpLog.WriteLine($"Drive could not read block ${currentBlock}. Sense follows..."); + _dumpLog.WriteLine($"Drive could not read block ${currentBlock}. Sense follows..."); - dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, - fxSense?.ASC, fxSense?.ASCQ); + _dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", fxSense?.SenseKey, + fxSense?.ASC, fxSense?.ASCQ); } // TODO: Reset device after X errors - if(stopOnError) + if(_stopOnError) return; // TODO: Return more cleanly // Write empty data DateTime writeStart = DateTime.Now; - outputPlugin.WriteSector(new byte[blockSize], currentBlock); + _outputPlugin.WriteSector(new byte[blockSize], currentBlock); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; mhddLog.Write(currentBlock, duration < 500 ? 65535 : duration); ibgLog.Write(currentBlock, 0); - resume.BadBlocks.Add(currentBlock); + _resume.BadBlocks.Add(currentBlock); } else { mhddLog.Write(currentBlock, duration); ibgLog.Write(currentBlock, currentSpeed * 1024); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSector(cmdBuf, currentBlock); + _outputPlugin.WriteSector(cmdBuf, currentBlock); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(currentBlock, 1, true); } currentBlock++; - resume.NextBlock++; + _resume.NextBlock++; currentSpeedSize += blockSize; double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; @@ -1032,42 +1033,42 @@ namespace DiscImageChef.Core.Devices.Dumping end = DateTime.UtcNow; // If not aborted this is added at the end of medium - if(aborted) + if(_aborted) { currentTapeFile.LastBlock = currentBlock - 1; - (outputPlugin as IWritableTapeImage).AddFile(currentTapeFile); + (_outputPlugin as IWritableTapeImage).AddFile(currentTapeFile); currentTapePartition.LastBlock = currentBlock - 1; - (outputPlugin as IWritableTapeImage).AddPartition(currentTapePartition); + (_outputPlugin as IWritableTapeImage).AddPartition(currentTapePartition); } EndProgress?.Invoke(); mhddLog.Close(); - ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, - blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000), - devicePath); + ibgLog.Close(_dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, + (blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000), + _devicePath); UpdateStatus?.Invoke($"Dump finished in {(end - start).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average dump speed {(double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000):F3} KiB/sec."); + Invoke($"Average dump speed {((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000):F3} KiB/sec."); UpdateStatus?. - Invoke($"Average write speed {(double)blockSize * (double)(blocks + 1) / 1024 / imageWriteDuration:F3} KiB/sec."); + Invoke($"Average write speed {((double)blockSize * (double)(blocks + 1)) / 1024 / imageWriteDuration:F3} KiB/sec."); - dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); - dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000)); + _dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000)); - dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / imageWriteDuration); + _dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / imageWriteDuration); #region Error handling - if(resume.BadBlocks.Count > 0 && - !aborted && - retryPasses > 0 && + if(_resume.BadBlocks.Count > 0 && + !_aborted && + _retryPasses > 0 && (canLocate || canLocateLong)) { int pass = 1; @@ -1076,22 +1077,22 @@ namespace DiscImageChef.Core.Devices.Dumping Modes.ModePage? currentModePage = null; - if(persistent) + if(_persistent) { // TODO: Implement persistent } InitProgress?.Invoke(); repeatRetry: - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); foreach(ulong badBlock in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -1101,19 +1102,19 @@ namespace DiscImageChef.Core.Devices.Dumping runningPersistent ? "recovering partial data, " : "")); UpdateStatus?.Invoke($"Positioning tape to block {badBlock}."); - dumpLog.WriteLine($"Positioning tape to block {badBlock}."); + _dumpLog.WriteLine($"Positioning tape to block {badBlock}."); if(canLocateLong) { - sense = dev.Locate16(out senseBuf, resume.NextBlock, dev.Timeout, out _); + sense = _dev.Locate16(out senseBuf, _resume.NextBlock, _dev.Timeout, out _); if(!sense) { - sense = dev.ReadPositionLong(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadPositionLong(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Could not check current position, continuing."); + _dumpLog.WriteLine("Could not check current position, continuing."); StoppingErrorMessage?.Invoke("Could not check current position, continuing."); continue; @@ -1121,9 +1122,9 @@ namespace DiscImageChef.Core.Devices.Dumping ulong position = Swapping.Swap(BitConverter.ToUInt64(cmdBuf, 8)); - if(position != resume.NextBlock) + if(position != _resume.NextBlock) { - dumpLog.WriteLine("Current position is not as expected, continuing."); + _dumpLog.WriteLine("Current position is not as expected, continuing."); StoppingErrorMessage?.Invoke("Current position is not as expected, continuing."); continue; @@ -1131,7 +1132,7 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - dumpLog.WriteLine($"Cannot position tape to block {badBlock}."); + _dumpLog.WriteLine($"Cannot position tape to block {badBlock}."); ErrorMessage?.Invoke($"Cannot position tape to block {badBlock}."); continue; @@ -1139,15 +1140,15 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - sense = dev.Locate(out senseBuf, (uint)resume.NextBlock, dev.Timeout, out _); + sense = _dev.Locate(out senseBuf, (uint)_resume.NextBlock, _dev.Timeout, out _); if(!sense) { - sense = dev.ReadPosition(out cmdBuf, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadPosition(out cmdBuf, out senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Could not check current position, continuing."); + _dumpLog.WriteLine("Could not check current position, continuing."); StoppingErrorMessage?.Invoke("Could not check current position, continuing."); continue; @@ -1155,9 +1156,9 @@ namespace DiscImageChef.Core.Devices.Dumping ulong position = Swapping.Swap(BitConverter.ToUInt32(cmdBuf, 4)); - if(position != resume.NextBlock) + if(position != _resume.NextBlock) { - dumpLog.WriteLine("Current position is not as expected, continuing."); + _dumpLog.WriteLine("Current position is not as expected, continuing."); StoppingErrorMessage?.Invoke("Current position is not as expected, continuing."); continue; @@ -1165,39 +1166,39 @@ namespace DiscImageChef.Core.Devices.Dumping } else { - dumpLog.WriteLine($"Cannot position tape to block {badBlock}."); + _dumpLog.WriteLine($"Cannot position tape to block {badBlock}."); ErrorMessage?.Invoke($"Cannot position tape to block {badBlock}."); continue; } } - sense = dev.Read6(out cmdBuf, out senseBuf, false, fixedLen, transferLen, blockSize, dev.Timeout, - out duration); + sense = _dev.Read6(out cmdBuf, out senseBuf, false, fixedLen, transferLen, blockSize, _dev.Timeout, + out duration); totalDuration += duration; if(!sense && - !dev.Error) + !_dev.Error) { - resume.BadBlocks.Remove(badBlock); + _resume.BadBlocks.Remove(badBlock); extents.Add(badBlock); - outputPlugin.WriteSector(cmdBuf, badBlock); + _outputPlugin.WriteSector(cmdBuf, badBlock); UpdateStatus?.Invoke($"Correctly retried block {badBlock} in pass {pass}."); - dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badBlock, pass); + _dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badBlock, pass); } else if(runningPersistent) - outputPlugin.WriteSector(cmdBuf, badBlock); + _outputPlugin.WriteSector(cmdBuf, badBlock); } - if(pass < retryPasses && - !aborted && - resume.BadBlocks.Count > 0) + if(pass < _retryPasses && + !_aborted && + _resume.BadBlocks.Count > 0) { pass++; forward = !forward; - resume.BadBlocks.Sort(); - resume.BadBlocks.Reverse(); + _resume.BadBlocks.Sort(); + _resume.BadBlocks.Reverse(); goto repeatRetry; } @@ -1211,50 +1212,50 @@ namespace DiscImageChef.Core.Devices.Dumping } #endregion Error handling - resume.BadBlocks.Sort(); + _resume.BadBlocks.Sort(); - foreach(ulong bad in resume.BadBlocks) - dumpLog.WriteLine("Block {0} could not be read.", bad); + foreach(ulong bad in _resume.BadBlocks) + _dumpLog.WriteLine("Block {0} could not be read.", bad); currentTry.Extents = ExtentsConverter.ToMetadata(extents); - outputPlugin.SetDumpHardware(resume.Tries); + _outputPlugin.SetDumpHardware(_resume.Tries); - if(preSidecar != null) - outputPlugin.SetCicmMetadata(preSidecar); + if(_preSidecar != null) + _outputPlugin.SetCicmMetadata(_preSidecar); - dumpLog.WriteLine("Closing output file."); + _dumpLog.WriteLine("Closing output file."); UpdateStatus?.Invoke("Closing output file."); DateTime closeStart = DateTime.Now; - outputPlugin.Close(); + _outputPlugin.Close(); DateTime closeEnd = DateTime.Now; UpdateStatus?.Invoke($"Closed in {(closeEnd - closeStart).TotalSeconds} seconds."); - dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); + _dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); - if(aborted) + if(_aborted) { UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); return; } - if(aborted) + if(_aborted) { UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); return; } double totalChkDuration = 0; - if(!nometadata) + if(!_nometadata) { UpdateStatus?.Invoke("Creating sidecar."); - dumpLog.WriteLine("Creating sidecar."); + _dumpLog.WriteLine("Creating sidecar."); var filters = new FiltersList(); - IFilter filter = filters.GetFilter(outputPath); + IFilter filter = filters.GetFilter(_outputPath); IMediaImage inputPlugin = ImageFormat.Detect(filter); if(!inputPlugin.Open(filter)) @@ -1265,32 +1266,32 @@ namespace DiscImageChef.Core.Devices.Dumping } DateTime chkStart = DateTime.UtcNow; - sidecarClass = new Sidecar(inputPlugin, outputPath, filter.Id, encoding); - sidecarClass.InitProgressEvent += InitProgress; - sidecarClass.UpdateProgressEvent += UpdateProgress; - sidecarClass.EndProgressEvent += EndProgress; - sidecarClass.InitProgressEvent2 += InitProgress2; - sidecarClass.UpdateProgressEvent2 += UpdateProgress2; - sidecarClass.EndProgressEvent2 += EndProgress2; - sidecarClass.UpdateStatusEvent += UpdateStatus; - CICMMetadataType sidecar = sidecarClass.Create(); + _sidecarClass = new Sidecar(inputPlugin, _outputPath, filter.Id, _encoding); + _sidecarClass.InitProgressEvent += InitProgress; + _sidecarClass.UpdateProgressEvent += UpdateProgress; + _sidecarClass.EndProgressEvent += EndProgress; + _sidecarClass.InitProgressEvent2 += InitProgress2; + _sidecarClass.UpdateProgressEvent2 += UpdateProgress2; + _sidecarClass.EndProgressEvent2 += EndProgress2; + _sidecarClass.UpdateStatusEvent += UpdateStatus; + CICMMetadataType sidecar = _sidecarClass.Create(); end = DateTime.UtcNow; totalChkDuration = (end - chkStart).TotalMilliseconds; UpdateStatus?.Invoke($"Sidecar created in {(end - chkStart).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average checksum speed {(double)blockSize * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); + Invoke($"Average checksum speed {((double)blockSize * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); - dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); + _dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); - dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000)); + _dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000)); - if(preSidecar != null) + if(_preSidecar != null) { - preSidecar.BlockMedia = sidecar.BlockMedia; - sidecar = preSidecar; + _preSidecar.BlockMedia = sidecar.BlockMedia; + sidecar = _preSidecar; } List<(ulong start, string type)> filesystems = new List<(ulong start, string type)>(); @@ -1307,7 +1308,7 @@ namespace DiscImageChef.Core.Devices.Dumping }).Distinct()) { UpdateStatus?.Invoke($"Found filesystem {filesystem.type} at sector {filesystem.start}"); - dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); + _dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); } sidecar.BlockMedia[0].Dimensions = Dimensions.DimensionsFromMediaType(dskType); @@ -1318,29 +1319,29 @@ namespace DiscImageChef.Core.Devices.Dumping sidecar.BlockMedia[0].DiskSubType = xmlType.subType; // TODO: Implement device firmware revision - if(!dev.IsRemovable || - dev.IsUsb) - if(dev.Type == DeviceType.ATAPI) + if(!_dev.IsRemovable || + _dev.IsUsb) + if(_dev.Type == DeviceType.ATAPI) sidecar.BlockMedia[0].Interface = "ATAPI"; - else if(dev.IsUsb) + else if(_dev.IsUsb) sidecar.BlockMedia[0].Interface = "USB"; - else if(dev.IsFireWire) + else if(_dev.IsFireWire) sidecar.BlockMedia[0].Interface = "FireWire"; else sidecar.BlockMedia[0].Interface = "SCSI"; sidecar.BlockMedia[0].LogicalBlocks = blocks; - sidecar.BlockMedia[0].Manufacturer = dev.Manufacturer; - sidecar.BlockMedia[0].Model = dev.Model; - sidecar.BlockMedia[0].Serial = dev.Serial; + sidecar.BlockMedia[0].Manufacturer = _dev.Manufacturer; + sidecar.BlockMedia[0].Model = _dev.Model; + sidecar.BlockMedia[0].Serial = _dev.Serial; sidecar.BlockMedia[0].Size = blocks * blockSize; - if(dev.IsRemovable) - sidecar.BlockMedia[0].DumpHardwareArray = resume.Tries.ToArray(); + if(_dev.IsRemovable) + sidecar.BlockMedia[0].DumpHardwareArray = _resume.Tries.ToArray(); UpdateStatus?.Invoke("Writing metadata sidecar"); - var xmlFs = new FileStream(outputPrefix + ".cicm.xml", FileMode.Create); + var xmlFs = new FileStream(_outputPrefix + ".cicm.xml", FileMode.Create); var xmlSer = new XmlSerializer(typeof(CICMMetadataType)); xmlSer.Serialize(xmlFs, sidecar); @@ -1353,11 +1354,11 @@ namespace DiscImageChef.Core.Devices.Dumping Invoke($"Took a total of {(end - start).TotalSeconds:F3} seconds ({totalDuration / 1000:F3} processing commands, {totalChkDuration / 1000:F3} checksumming, {imageWriteDuration:F3} writing, {(closeEnd - closeStart).TotalSeconds:F3} closing)."); UpdateStatus?. - Invoke($"Average speed: {(double)blockSize * (double)(blocks + 1) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); + Invoke($"Average speed: {((double)blockSize * (double)(blocks + 1)) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); UpdateStatus?.Invoke($"Fastest speed burst: {maxSpeed:F3} MiB/sec."); UpdateStatus?.Invoke($"Slowest speed burst: {minSpeed:F3} MiB/sec."); - UpdateStatus?.Invoke($"{resume.BadBlocks.Count} sectors could not be read."); + UpdateStatus?.Invoke($"{_resume.BadBlocks.Count} sectors could not be read."); UpdateStatus?.Invoke(""); Statistics.AddMedia(dskType, true); diff --git a/DiscImageChef.Core/Devices/Dumping/SecureDigital.cs b/DiscImageChef.Core/Devices/Dumping/SecureDigital.cs index 7150ade03..a18f0286c 100644 --- a/DiscImageChef.Core/Devices/Dumping/SecureDigital.cs +++ b/DiscImageChef.Core/Devices/Dumping/SecureDigital.cs @@ -53,9 +53,9 @@ namespace DiscImageChef.Core.Devices.Dumping /// Dumps a MultiMediaCard or SecureDigital flash card public void SecureDigital() { - if(dumpRaw) + if(_dumpRaw) { - if(force) + if(_force) ErrorMessage?. Invoke("Raw dumping is not supported in MultiMediaCard or SecureDigital devices. Continuing..."); else @@ -84,13 +84,13 @@ namespace DiscImageChef.Core.Devices.Dumping Dictionary mediaTags = new Dictionary(); - switch(dev.Type) + switch(_dev.Type) { case DeviceType.MMC: { UpdateStatus?.Invoke("Reading Extended CSD"); - dumpLog.WriteLine("Reading Extended CSD"); - sense = dev.ReadExtendedCsd(out ecsd, out _, TIMEOUT, out duration); + _dumpLog.WriteLine("Reading Extended CSD"); + sense = _dev.ReadExtendedCsd(out ecsd, out _, TIMEOUT, out duration); if(!sense) { @@ -112,8 +112,8 @@ namespace DiscImageChef.Core.Devices.Dumping ecsd = null; UpdateStatus?.Invoke("Reading CSD"); - dumpLog.WriteLine("Reading CSD"); - sense = dev.ReadCsd(out csd, out _, TIMEOUT, out duration); + _dumpLog.WriteLine("Reading CSD"); + sense = _dev.ReadCsd(out csd, out _, TIMEOUT, out duration); if(!sense) { @@ -130,8 +130,8 @@ namespace DiscImageChef.Core.Devices.Dumping csd = null; UpdateStatus?.Invoke("Reading OCR"); - dumpLog.WriteLine("Reading OCR"); - sense = dev.ReadOcr(out ocr, out _, TIMEOUT, out duration); + _dumpLog.WriteLine("Reading OCR"); + sense = _dev.ReadOcr(out ocr, out _, TIMEOUT, out duration); if(sense) ocr = null; @@ -144,8 +144,8 @@ namespace DiscImageChef.Core.Devices.Dumping case DeviceType.SecureDigital: { UpdateStatus?.Invoke("Reading CSD"); - dumpLog.WriteLine("Reading CSD"); - sense = dev.ReadCsd(out csd, out _, TIMEOUT, out duration); + _dumpLog.WriteLine("Reading CSD"); + sense = _dev.ReadCsd(out csd, out _, TIMEOUT, out duration); if(!sense) { @@ -165,8 +165,8 @@ namespace DiscImageChef.Core.Devices.Dumping csd = null; UpdateStatus?.Invoke("Reading OCR"); - dumpLog.WriteLine("Reading OCR"); - sense = dev.ReadSdocr(out ocr, out _, TIMEOUT, out duration); + _dumpLog.WriteLine("Reading OCR"); + sense = _dev.ReadSdocr(out ocr, out _, TIMEOUT, out duration); if(sense) ocr = null; @@ -174,8 +174,8 @@ namespace DiscImageChef.Core.Devices.Dumping mediaTags.Add(MediaTagType.SD_OCR, null); UpdateStatus?.Invoke("Reading SCR"); - dumpLog.WriteLine("Reading SCR"); - sense = dev.ReadScr(out scr, out _, TIMEOUT, out duration); + _dumpLog.WriteLine("Reading SCR"); + sense = _dev.ReadScr(out scr, out _, TIMEOUT, out duration); if(sense) scr = null; @@ -187,13 +187,13 @@ namespace DiscImageChef.Core.Devices.Dumping } UpdateStatus?.Invoke("Reading CID"); - dumpLog.WriteLine("Reading CID"); - sense = dev.ReadCid(out byte[] cid, out _, TIMEOUT, out duration); + _dumpLog.WriteLine("Reading CID"); + sense = _dev.ReadCid(out byte[] cid, out _, TIMEOUT, out duration); if(sense) cid = null; else - mediaTags.Add(dev.Type == DeviceType.SecureDigital ? MediaTagType.SD_CID : MediaTagType.MMC_CID, null); + mediaTags.Add(_dev.Type == DeviceType.SecureDigital ? MediaTagType.SD_CID : MediaTagType.MMC_CID, null); DateTime start; DateTime end; @@ -204,21 +204,21 @@ namespace DiscImageChef.Core.Devices.Dumping if(blocks == 0) { - dumpLog.WriteLine("Unable to get device size."); + _dumpLog.WriteLine("Unable to get device size."); StoppingErrorMessage?.Invoke("Unable to get device size."); return; } UpdateStatus?.Invoke($"Device reports {blocks} blocks."); - dumpLog.WriteLine("Device reports {0} blocks.", blocks); + _dumpLog.WriteLine("Device reports {0} blocks.", blocks); byte[] cmdBuf; bool error; while(true) { - error = dev.Read(out cmdBuf, out _, 0, blockSize, blocksToRead, byteAddressed, TIMEOUT, out duration); + error = _dev.Read(out cmdBuf, out _, 0, blockSize, blocksToRead, byteAddressed, TIMEOUT, out duration); if(error) blocksToRead /= 2; @@ -230,23 +230,23 @@ namespace DiscImageChef.Core.Devices.Dumping if(error) { - dumpLog.WriteLine("ERROR: Cannot get blocks to read, device error {0}.", dev.LastError); - StoppingErrorMessage?.Invoke($"Device error {dev.LastError} trying to guess ideal transfer length."); + _dumpLog.WriteLine("ERROR: Cannot get blocks to read, device error {0}.", _dev.LastError); + StoppingErrorMessage?.Invoke($"Device error {_dev.LastError} trying to guess ideal transfer length."); return; } UpdateStatus?.Invoke($"Device can read {blocksToRead} blocks at a time."); - dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); + _dumpLog.WriteLine("Device can read {0} blocks at a time.", blocksToRead); - if(skip < blocksToRead) - skip = blocksToRead; + if(_skip < blocksToRead) + _skip = blocksToRead; DumpHardwareType currentTry = null; ExtentsULong extents = null; - ResumeSupport.Process(true, false, blocks, dev.Manufacturer, dev.Model, dev.Serial, dev.PlatformId, - ref resume, ref currentTry, ref extents); + ResumeSupport.Process(true, false, blocks, _dev.Manufacturer, _dev.Model, _dev.Serial, _dev.PlatformId, + ref _resume, ref currentTry, ref extents); if(currentTry == null || extents == null) @@ -260,53 +260,53 @@ namespace DiscImageChef.Core.Devices.Dumping foreach(MediaTagType tag in mediaTags.Keys) { - if(outputPlugin.SupportedMediaTags.Contains(tag)) + if(_outputPlugin.SupportedMediaTags.Contains(tag)) continue; ret = false; - dumpLog.WriteLine($"Output format does not support {tag}."); + _dumpLog.WriteLine($"Output format does not support {tag}."); ErrorMessage?.Invoke($"Output format does not support {tag}."); } if(!ret) { - if(force) + if(_force) { - dumpLog.WriteLine("Several media tags not supported, continuing..."); + _dumpLog.WriteLine("Several media tags not supported, continuing..."); ErrorMessage?.Invoke("Several media tags not supported, continuing..."); } else { - dumpLog.WriteLine("Several media tags not supported, not continuing..."); + _dumpLog.WriteLine("Several media tags not supported, not continuing..."); StoppingErrorMessage?.Invoke("Several media tags not supported, not continuing..."); return; } } - var mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, blocksToRead); - var ibgLog = new IbgLog(outputPrefix + ".ibg", SD_PROFILE); + var mhddLog = new MhddLog(_outputPrefix + ".mhddlog.bin", _dev, blocks, blockSize, blocksToRead); + var ibgLog = new IbgLog(_outputPrefix + ".ibg", SD_PROFILE); - ret = outputPlugin.Create(outputPath, - dev.Type == DeviceType.SecureDigital ? MediaType.SecureDigital : MediaType.MMC, - formatOptions, blocks, blockSize); + ret = _outputPlugin.Create(_outputPath, + _dev.Type == DeviceType.SecureDigital ? MediaType.SecureDigital : MediaType.MMC, + _formatOptions, blocks, blockSize); // Cannot create image if(!ret) { - dumpLog.WriteLine("Error creating output image, not continuing."); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Error creating output image, not continuing."); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error creating output image, not continuing." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } - if(resume.NextBlock > 0) + if(_resume.NextBlock > 0) { - UpdateStatus?.Invoke($"Resuming from block {resume.NextBlock}."); - dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock); + UpdateStatus?.Invoke($"Resuming from block {_resume.NextBlock}."); + _dumpLog.WriteLine("Resuming from block {0}.", _resume.NextBlock); } start = DateTime.UtcNow; @@ -317,13 +317,13 @@ namespace DiscImageChef.Core.Devices.Dumping InitProgress?.Invoke(); - for(ulong i = resume.NextBlock; i < blocks; i += blocksToRead) + for(ulong i = _resume.NextBlock; i < blocks; i += blocksToRead) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -344,46 +344,46 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateProgress?.Invoke($"Reading sector {i} of {blocks} ({currentSpeed:F3} MiB/sec.)", (long)i, (long)blocks); - error = dev.Read(out cmdBuf, out _, (uint)i, blockSize, blocksToRead, byteAddressed, TIMEOUT, - out duration); + error = _dev.Read(out cmdBuf, out _, (uint)i, blockSize, blocksToRead, byteAddressed, TIMEOUT, + out duration); if(!error) { mhddLog.Write(i, duration); ibgLog.Write(i, currentSpeed * 1024); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(cmdBuf, i, blocksToRead); + _outputPlugin.WriteSectors(cmdBuf, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); } else { - if(i + skip > blocks) - skip = (uint)(blocks - i); + if(i + _skip > blocks) + _skip = (uint)(blocks - i); - for(ulong b = i; b < i + skip; b++) - resume.BadBlocks.Add(b); + for(ulong b = i; b < i + _skip; b++) + _resume.BadBlocks.Add(b); mhddLog.Write(i, duration < 500 ? 65535 : duration); ibgLog.Write(i, 0); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(new byte[blockSize * skip], i, skip); + _outputPlugin.WriteSectors(new byte[blockSize * _skip], i, _skip); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; - dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", skip, i); - i += skip - blocksToRead; + _dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", _skip, i); + i += _skip - blocksToRead; newTrim = true; } - sectorSpeedStart += blocksToRead; - resume.NextBlock = i + blocksToRead; + sectorSpeedStart += blocksToRead; + _resume.NextBlock = i + blocksToRead; double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; if(elapsed < 1) continue; - currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed); + currentSpeed = (sectorSpeedStart * blockSize) / (1048576 * elapsed); sectorSpeedStart = 0; timeSpeedStart = DateTime.UtcNow; } @@ -392,76 +392,76 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); mhddLog.Close(); - ibgLog.Close(dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, - blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000), - devicePath); + ibgLog.Close(_dev, blocks, blockSize, (end - start).TotalSeconds, currentSpeed * 1024, + (blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000), + _devicePath); UpdateStatus?.Invoke($"Dump finished in {(end - start).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average dump speed {(double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000):F3} KiB/sec."); + Invoke($"Average dump speed {((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000):F3} KiB/sec."); UpdateStatus?. - Invoke($"Average write speed {(double)blockSize * (double)(blocks + 1) / 1024 / imageWriteDuration:F3} KiB/sec."); + Invoke($"Average write speed {((double)blockSize * (double)(blocks + 1)) / 1024 / imageWriteDuration:F3} KiB/sec."); - dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); - dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / (totalDuration / 1000)); + _dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalDuration / 1000)); - dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / imageWriteDuration); + _dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / imageWriteDuration); #region Trimming - if(resume.BadBlocks.Count > 0 && - !aborted && - !notrim && + if(_resume.BadBlocks.Count > 0 && + !_aborted && + !_notrim && newTrim) { start = DateTime.UtcNow; UpdateStatus?.Invoke("Trimming bad sectors"); - dumpLog.WriteLine("Trimming bad sectors"); + _dumpLog.WriteLine("Trimming bad sectors"); - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); InitProgress?.Invoke(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } PulseProgress?.Invoke($"Trimming sector {badSector}"); - error = dev.Read(out cmdBuf, out _, (uint)badSector, blockSize, 1, byteAddressed, TIMEOUT, - out duration); + error = _dev.Read(out cmdBuf, out _, (uint)badSector, blockSize, 1, byteAddressed, TIMEOUT, + out duration); totalDuration += duration; if(error) continue; - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(cmdBuf, badSector); + _outputPlugin.WriteSector(cmdBuf, badSector); } EndProgress?.Invoke(); end = DateTime.UtcNow; UpdateStatus?.Invoke($"Trimmming finished in {(end - start).TotalSeconds} seconds."); - dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); } #endregion Trimming #region Error handling - if(resume.BadBlocks.Count > 0 && - !aborted && - retryPasses > 0) + if(_resume.BadBlocks.Count > 0 && + !_aborted && + _retryPasses > 0) { int pass = 1; bool forward = true; @@ -469,15 +469,15 @@ namespace DiscImageChef.Core.Devices.Dumping InitProgress?.Invoke(); repeatRetryLba: - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -486,31 +486,31 @@ namespace DiscImageChef.Core.Devices.Dumping forward ? "forward" : "reverse", runningPersistent ? "recovering partial data, " : "")); - error = dev.Read(out cmdBuf, out _, (uint)badSector, blockSize, 1, byteAddressed, TIMEOUT, - out duration); + error = _dev.Read(out cmdBuf, out _, (uint)badSector, blockSize, 1, byteAddressed, TIMEOUT, + out duration); totalDuration += duration; if(!error) { - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(cmdBuf, badSector); + _outputPlugin.WriteSector(cmdBuf, badSector); UpdateStatus?.Invoke($"Correctly retried block {badSector} in pass {pass}."); - dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); + _dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); } else if(runningPersistent) - outputPlugin.WriteSector(cmdBuf, badSector); + _outputPlugin.WriteSector(cmdBuf, badSector); } - if(pass < retryPasses && - !aborted && - resume.BadBlocks.Count > 0) + if(pass < _retryPasses && + !_aborted && + _resume.BadBlocks.Count > 0) { pass++; forward = !forward; - resume.BadBlocks.Sort(); - resume.BadBlocks.Reverse(); + _resume.BadBlocks.Sort(); + _resume.BadBlocks.Reverse(); goto repeatRetryLba; } @@ -521,58 +521,58 @@ namespace DiscImageChef.Core.Devices.Dumping currentTry.Extents = ExtentsConverter.ToMetadata(extents); - outputPlugin.SetDumpHardware(resume.Tries); + _outputPlugin.SetDumpHardware(_resume.Tries); - if(preSidecar != null) - outputPlugin.SetCicmMetadata(preSidecar); + if(_preSidecar != null) + _outputPlugin.SetCicmMetadata(_preSidecar); - dumpLog.WriteLine("Closing output file."); + _dumpLog.WriteLine("Closing output file."); UpdateStatus?.Invoke("Closing output file."); DateTime closeStart = DateTime.Now; - outputPlugin.Close(); + _outputPlugin.Close(); DateTime closeEnd = DateTime.Now; UpdateStatus?.Invoke($"Closed in {(closeEnd - closeStart).TotalSeconds} seconds."); - dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); + _dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); - if(aborted) + if(_aborted) { UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); return; } double totalChkDuration = 0; - if(!nometadata) + if(!_nometadata) { UpdateStatus?.Invoke("Creating sidecar."); - dumpLog.WriteLine("Creating sidecar."); + _dumpLog.WriteLine("Creating sidecar."); var filters = new FiltersList(); - IFilter filter = filters.GetFilter(outputPath); + IFilter filter = filters.GetFilter(_outputPath); IMediaImage inputPlugin = ImageFormat.Detect(filter); if(!inputPlugin.Open(filter)) StoppingErrorMessage?.Invoke("Could not open created image."); DateTime chkStart = DateTime.UtcNow; - sidecarClass = new Sidecar(inputPlugin, outputPath, filter.Id, encoding); - sidecarClass.InitProgressEvent += InitProgress; - sidecarClass.UpdateProgressEvent += UpdateProgress; - sidecarClass.EndProgressEvent += EndProgress; - sidecarClass.InitProgressEvent2 += InitProgress2; - sidecarClass.UpdateProgressEvent2 += UpdateProgress2; - sidecarClass.EndProgressEvent2 += EndProgress2; - sidecarClass.UpdateStatusEvent += UpdateStatus; - CICMMetadataType sidecar = sidecarClass.Create(); + _sidecarClass = new Sidecar(inputPlugin, _outputPath, filter.Id, _encoding); + _sidecarClass.InitProgressEvent += InitProgress; + _sidecarClass.UpdateProgressEvent += UpdateProgress; + _sidecarClass.EndProgressEvent += EndProgress; + _sidecarClass.InitProgressEvent2 += InitProgress2; + _sidecarClass.UpdateProgressEvent2 += UpdateProgress2; + _sidecarClass.EndProgressEvent2 += EndProgress2; + _sidecarClass.UpdateStatusEvent += UpdateStatus; + CICMMetadataType sidecar = _sidecarClass.Create(); - if(preSidecar != null) + if(_preSidecar != null) { - preSidecar.BlockMedia = sidecar.BlockMedia; - sidecar = preSidecar; + _preSidecar.BlockMedia = sidecar.BlockMedia; + sidecar = _preSidecar; } - switch(dev.Type) + switch(_dev.Type) { case DeviceType.MMC: sidecar.BlockMedia[0].MultiMediaCard = new MultiMediaCardType(); @@ -592,22 +592,22 @@ namespace DiscImageChef.Core.Devices.Dumping { cidDump = new DumpType { - Image = outputPath, Size = (ulong)cid.Length, Checksums = Checksum.GetChecksums(cid).ToArray() + Image = _outputPath, Size = (ulong)cid.Length, Checksums = Checksum.GetChecksums(cid).ToArray() }; ret = - outputPlugin.WriteMediaTag(cid, - dev.Type == DeviceType.SecureDigital ? MediaTagType.SD_CID - : MediaTagType.MMC_CID); + _outputPlugin.WriteMediaTag(cid, + _dev.Type == DeviceType.SecureDigital ? MediaTagType.SD_CID + : MediaTagType.MMC_CID); // Cannot write CID to image if(!ret && - !force) + !_force) { - dumpLog.WriteLine("Cannot write CID to output image."); + _dumpLog.WriteLine("Cannot write CID to output image."); StoppingErrorMessage?.Invoke("Cannot write CID to output image." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -617,22 +617,22 @@ namespace DiscImageChef.Core.Devices.Dumping { csdDump = new DumpType { - Image = outputPath, Size = (ulong)csd.Length, Checksums = Checksum.GetChecksums(csd).ToArray() + Image = _outputPath, Size = (ulong)csd.Length, Checksums = Checksum.GetChecksums(csd).ToArray() }; ret = - outputPlugin.WriteMediaTag(csd, - dev.Type == DeviceType.SecureDigital ? MediaTagType.SD_CSD - : MediaTagType.MMC_CSD); + _outputPlugin.WriteMediaTag(csd, + _dev.Type == DeviceType.SecureDigital ? MediaTagType.SD_CSD + : MediaTagType.MMC_CSD); // Cannot write CSD to image if(!ret && - !force) + !_force) { - dumpLog.WriteLine("Cannot write CSD to output image."); + _dumpLog.WriteLine("Cannot write CSD to output image."); StoppingErrorMessage?.Invoke("Cannot write CSD to output image." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -642,20 +642,21 @@ namespace DiscImageChef.Core.Devices.Dumping { sidecar.BlockMedia[0].MultiMediaCard.ExtendedCSD = new DumpType { - Image = outputPath, Size = (ulong)ecsd.Length, Checksums = Checksum.GetChecksums(ecsd).ToArray() + Image = _outputPath, Size = (ulong)ecsd.Length, + Checksums = Checksum.GetChecksums(ecsd).ToArray() }; - ret = outputPlugin.WriteMediaTag(ecsd, MediaTagType.MMC_ExtendedCSD); + ret = _outputPlugin.WriteMediaTag(ecsd, MediaTagType.MMC_ExtendedCSD); // Cannot write Extended CSD to image if(!ret && - !force) + !_force) { - dumpLog.WriteLine("Cannot write Extended CSD to output image."); + _dumpLog.WriteLine("Cannot write Extended CSD to output image."); StoppingErrorMessage?.Invoke("Cannot write Extended CSD to output image." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -665,22 +666,22 @@ namespace DiscImageChef.Core.Devices.Dumping { ocrDump = new DumpType { - Image = outputPath, Size = (ulong)ocr.Length, Checksums = Checksum.GetChecksums(ocr).ToArray() + Image = _outputPath, Size = (ulong)ocr.Length, Checksums = Checksum.GetChecksums(ocr).ToArray() }; ret = - outputPlugin.WriteMediaTag(ocr, - dev.Type == DeviceType.SecureDigital ? MediaTagType.SD_OCR - : MediaTagType.MMC_OCR); + _outputPlugin.WriteMediaTag(ocr, + _dev.Type == DeviceType.SecureDigital ? MediaTagType.SD_OCR + : MediaTagType.MMC_OCR); // Cannot write OCR to image if(!ret && - !force) + !_force) { - dumpLog.WriteLine("Cannot write OCR to output image."); + _dumpLog.WriteLine("Cannot write OCR to output image."); StoppingErrorMessage?.Invoke("Cannot write OCR to output image." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -690,25 +691,25 @@ namespace DiscImageChef.Core.Devices.Dumping { sidecar.BlockMedia[0].SecureDigital.SCR = new DumpType { - Image = outputPath, Size = (ulong)scr.Length, Checksums = Checksum.GetChecksums(scr).ToArray() + Image = _outputPath, Size = (ulong)scr.Length, Checksums = Checksum.GetChecksums(scr).ToArray() }; - ret = outputPlugin.WriteMediaTag(scr, MediaTagType.SD_SCR); + ret = _outputPlugin.WriteMediaTag(scr, MediaTagType.SD_SCR); // Cannot write SCR to image if(!ret && - !force) + !_force) { - dumpLog.WriteLine("Cannot write SCR to output image."); + _dumpLog.WriteLine("Cannot write SCR to output image."); StoppingErrorMessage?.Invoke("Cannot write SCR to output image." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } } - switch(dev.Type) + switch(_dev.Type) { case DeviceType.MMC: sidecar.BlockMedia[0].MultiMediaCard.CID = cidDump; @@ -730,20 +731,19 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke($"Sidecar created in {(end - chkStart).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average checksum speed {(double)blockSize * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); + Invoke($"Average checksum speed {((double)blockSize * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); - dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); + _dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); - dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", - (double)blockSize * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000)); + _dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", + ((double)blockSize * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000)); (string type, string subType) xmlType = (null, null); - switch(dev.Type) + switch(_dev.Type) { case DeviceType.MMC: - xmlType = - CommonTypes.Metadata.MediaType.MediaTypeToString(MediaType.MMC); + xmlType = CommonTypes.Metadata.MediaType.MediaTypeToString(MediaType.MMC); sidecar.BlockMedia[0].Dimensions = Dimensions.DimensionsFromMediaType(MediaType.MMC); @@ -762,14 +762,14 @@ namespace DiscImageChef.Core.Devices.Dumping sidecar.BlockMedia[0].LogicalBlocks = blocks; sidecar.BlockMedia[0].PhysicalBlockSize = physicalBlockSize > 0 ? physicalBlockSize : blockSize; sidecar.BlockMedia[0].LogicalBlockSize = blockSize; - sidecar.BlockMedia[0].Manufacturer = dev.Manufacturer; - sidecar.BlockMedia[0].Model = dev.Model; - sidecar.BlockMedia[0].Serial = dev.Serial; + sidecar.BlockMedia[0].Manufacturer = _dev.Manufacturer; + sidecar.BlockMedia[0].Model = _dev.Model; + sidecar.BlockMedia[0].Serial = _dev.Serial; sidecar.BlockMedia[0].Size = blocks * blockSize; UpdateStatus?.Invoke("Writing metadata sidecar"); - var xmlFs = new FileStream(outputPrefix + ".cicm.xml", FileMode.Create); + var xmlFs = new FileStream(_outputPrefix + ".cicm.xml", FileMode.Create); var xmlSer = new XmlSerializer(typeof(CICMMetadataType)); xmlSer.Serialize(xmlFs, sidecar); @@ -782,17 +782,17 @@ namespace DiscImageChef.Core.Devices.Dumping Invoke($"Took a total of {(end - start).TotalSeconds:F3} seconds ({totalDuration / 1000:F3} processing commands, {totalChkDuration / 1000:F3} checksumming, {imageWriteDuration:F3} writing, {(closeEnd - closeStart).TotalSeconds:F3} closing)."); UpdateStatus?. - Invoke($"Average speed: {(double)blockSize * (double)(blocks + 1) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); + Invoke($"Average speed: {((double)blockSize * (double)(blocks + 1)) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); UpdateStatus?.Invoke($"Fastest speed burst: {maxSpeed:F3} MiB/sec."); UpdateStatus?.Invoke($"Slowest speed burst: {minSpeed:F3} MiB/sec."); - UpdateStatus?.Invoke($"{resume.BadBlocks.Count} sectors could not be read."); + UpdateStatus?.Invoke($"{_resume.BadBlocks.Count} sectors could not be read."); UpdateStatus?.Invoke(""); - if(resume.BadBlocks.Count > 0) - resume.BadBlocks.Sort(); + if(_resume.BadBlocks.Count > 0) + _resume.BadBlocks.Sort(); - switch(dev.Type) + switch(_dev.Type) { case DeviceType.MMC: Statistics.AddMedia(MediaType.MMC, true); diff --git a/DiscImageChef.Core/Devices/Dumping/XGD.cs b/DiscImageChef.Core/Devices/Dumping/XGD.cs index 22b4971af..b8b64726e 100644 --- a/DiscImageChef.Core/Devices/Dumping/XGD.cs +++ b/DiscImageChef.Core/Devices/Dumping/XGD.cs @@ -75,14 +75,14 @@ namespace DiscImageChef.Core.Devices.Dumping if(DetectOS.GetRealPlatformID() != PlatformID.Win32NT) { - bool isAdmin = dev.IsRemote ? dev.IsRemoteAdmin : DetectOS.IsAdmin; + bool isAdmin = _dev.IsRemote ? _dev.IsRemoteAdmin : DetectOS.IsAdmin; if(!isAdmin) { DicConsole. ErrorWriteLine("Because of the commands sent to a device, dumping XGD must be done with administrative privileges. Cannot continue."); - dumpLog.WriteLine("Cannot dump XGD without administrative privileges."); + _dumpLog.WriteLine("Cannot dump XGD without administrative privileges."); return; } @@ -95,47 +95,47 @@ namespace DiscImageChef.Core.Devices.Dumping mediaTags.Remove(MediaTagType.DVD_DMI); // Drive shall move to lock state when a new disc is inserted. Old kreon versions do not lock correctly so save this - sense = dev.ReadCapacity(out byte[] coldReadCapacity, out byte[] senseBuf, dev.Timeout, out _); + sense = _dev.ReadCapacity(out byte[] coldReadCapacity, out byte[] senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Cannot get disc capacity."); + _dumpLog.WriteLine("Cannot get disc capacity."); StoppingErrorMessage?.Invoke("Cannot get disc capacity."); return; } // Drive shall move to lock state when a new disc is inserted. Old kreon versions do not lock correctly so save this - sense = dev.ReadDiscStructure(out byte[] coldPfi, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _); + sense = _dev.ReadDiscStructure(out byte[] coldPfi, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _); if(sense) { - dumpLog.WriteLine("Cannot get PFI."); + _dumpLog.WriteLine("Cannot get PFI."); StoppingErrorMessage?.Invoke("Cannot get PFI."); return; } UpdateStatus?.Invoke("Reading Xbox Security Sector."); - dumpLog.WriteLine("Reading Xbox Security Sector."); - sense = dev.KreonExtractSs(out byte[] ssBuf, out senseBuf, dev.Timeout, out _); + _dumpLog.WriteLine("Reading Xbox Security Sector."); + sense = _dev.KreonExtractSs(out byte[] ssBuf, out senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Cannot get Xbox Security Sector, not continuing."); + _dumpLog.WriteLine("Cannot get Xbox Security Sector, not continuing."); StoppingErrorMessage?.Invoke("Cannot get Xbox Security Sector, not continuing."); return; } - dumpLog.WriteLine("Decoding Xbox Security Sector."); + _dumpLog.WriteLine("Decoding Xbox Security Sector."); UpdateStatus?.Invoke("Decoding Xbox Security Sector."); SS.SecuritySector? xboxSs = SS.Decode(ssBuf); if(!xboxSs.HasValue) { - dumpLog.WriteLine("Cannot decode Xbox Security Sector, not continuing."); + _dumpLog.WriteLine("Cannot decode Xbox Security Sector, not continuing."); StoppingErrorMessage?.Invoke("Cannot decode Xbox Security Sector, not continuing."); return; @@ -148,24 +148,24 @@ namespace DiscImageChef.Core.Devices.Dumping // Get video partition size DicConsole.DebugWriteLine("Dump-media command", "Getting video partition size"); UpdateStatus?.Invoke("Locking drive."); - dumpLog.WriteLine("Locking drive."); - sense = dev.KreonLock(out senseBuf, dev.Timeout, out _); + _dumpLog.WriteLine("Locking drive."); + sense = _dev.KreonLock(out senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Cannot lock drive, not continuing."); + _dumpLog.WriteLine("Cannot lock drive, not continuing."); StoppingErrorMessage?.Invoke("Cannot lock drive, not continuing."); return; } UpdateStatus?.Invoke("Getting video partition size."); - dumpLog.WriteLine("Getting video partition size."); - sense = dev.ReadCapacity(out byte[] readBuffer, out senseBuf, dev.Timeout, out _); + _dumpLog.WriteLine("Getting video partition size."); + sense = _dev.ReadCapacity(out byte[] readBuffer, out senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Cannot get disc capacity."); + _dumpLog.WriteLine("Cannot get disc capacity."); StoppingErrorMessage?.Invoke("Cannot get disc capacity."); return; @@ -175,14 +175,14 @@ namespace DiscImageChef.Core.Devices.Dumping (ulong)((readBuffer[0] << 24) + (readBuffer[1] << 16) + (readBuffer[2] << 8) + readBuffer[3]); UpdateStatus?.Invoke("Reading Physical Format Information."); - dumpLog.WriteLine("Reading Physical Format Information."); + _dumpLog.WriteLine("Reading Physical Format Information."); - sense = dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _); + sense = _dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _); if(sense) { - dumpLog.WriteLine("Cannot get PFI."); + _dumpLog.WriteLine("Cannot get PFI."); StoppingErrorMessage?.Invoke("Cannot get PFI."); return; @@ -193,19 +193,19 @@ namespace DiscImageChef.Core.Devices.Dumping mediaTags.Add(MediaTagType.DVD_PFI, tmpBuf); DicConsole.DebugWriteLine("Dump-media command", "Video partition total size: {0} sectors", totalSize); - ulong l0Video = PFI.Decode(readBuffer).Value.Layer0EndPSN - PFI.Decode(readBuffer).Value.DataAreaStartPSN + - 1; + ulong l0Video = + (PFI.Decode(readBuffer).Value.Layer0EndPSN - PFI.Decode(readBuffer).Value.DataAreaStartPSN) + 1; - ulong l1Video = totalSize - l0Video + 1; + ulong l1Video = (totalSize - l0Video) + 1; UpdateStatus?.Invoke("Reading Disc Manufacturing Information."); - dumpLog.WriteLine("Reading Disc Manufacturing Information."); + _dumpLog.WriteLine("Reading Disc Manufacturing Information."); - sense = dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.DiscManufacturingInformation, 0, 0, out _); + sense = _dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.DiscManufacturingInformation, 0, 0, out _); if(sense) { - dumpLog.WriteLine("Cannot get DMI."); + _dumpLog.WriteLine("Cannot get DMI."); StoppingErrorMessage?.Invoke("Cannot get DMI."); return; @@ -219,7 +219,7 @@ namespace DiscImageChef.Core.Devices.Dumping if(totalSize > 300000) { UpdateStatus?.Invoke("Video partition is too big, did lock work? Trying cold values."); - dumpLog.WriteLine("Video partition is too big, did lock work? Trying cold values."); + _dumpLog.WriteLine("Video partition is too big, did lock work? Trying cold values."); totalSize = (ulong)((coldReadCapacity[0] << 24) + (coldReadCapacity[1] << 16) + (coldReadCapacity[2] << 8) + coldReadCapacity[3]); @@ -230,13 +230,13 @@ namespace DiscImageChef.Core.Devices.Dumping mediaTags.Add(MediaTagType.DVD_PFI, tmpBuf); DicConsole.DebugWriteLine("Dump-media command", "Video partition total size: {0} sectors", totalSize); - l0Video = PFI.Decode(coldPfi).Value.Layer0EndPSN - PFI.Decode(coldPfi).Value.DataAreaStartPSN + 1; + l0Video = (PFI.Decode(coldPfi).Value.Layer0EndPSN - PFI.Decode(coldPfi).Value.DataAreaStartPSN) + 1; - l1Video = totalSize - l0Video + 1; + l1Video = (totalSize - l0Video) + 1; if(totalSize > 300000) { - dumpLog.WriteLine("Cannot get video partition size, not continuing. Try to eject and reinsert the drive, if it keeps happening, contact support."); + _dumpLog.WriteLine("Cannot get video partition size, not continuing. Try to eject and reinsert the drive, if it keeps happening, contact support."); StoppingErrorMessage?. Invoke("Cannot get video partition size, not continuing. Try to eject and reinsert the drive, if it keeps happening, contact support."); @@ -248,24 +248,24 @@ namespace DiscImageChef.Core.Devices.Dumping // Get game partition size DicConsole.DebugWriteLine("Dump-media command", "Getting game partition size"); UpdateStatus?.Invoke("Unlocking drive (Xtreme)."); - dumpLog.WriteLine("Unlocking drive (Xtreme)."); - sense = dev.KreonUnlockXtreme(out senseBuf, dev.Timeout, out _); + _dumpLog.WriteLine("Unlocking drive (Xtreme)."); + sense = _dev.KreonUnlockXtreme(out senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Cannot unlock drive, not continuing."); + _dumpLog.WriteLine("Cannot unlock drive, not continuing."); StoppingErrorMessage?.Invoke("Cannot unlock drive, not continuing."); return; } UpdateStatus?.Invoke("Getting game partition size."); - dumpLog.WriteLine("Getting game partition size."); - sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out _); + _dumpLog.WriteLine("Getting game partition size."); + sense = _dev.ReadCapacity(out readBuffer, out senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Cannot get disc capacity."); + _dumpLog.WriteLine("Cannot get disc capacity."); StoppingErrorMessage?.Invoke("Cannot get disc capacity."); return; @@ -279,24 +279,24 @@ namespace DiscImageChef.Core.Devices.Dumping // Get middle zone size DicConsole.DebugWriteLine("Dump-media command", "Getting middle zone size"); UpdateStatus?.Invoke("Unlocking drive (Wxripper)."); - dumpLog.WriteLine("Unlocking drive (Wxripper)."); - sense = dev.KreonUnlockWxripper(out senseBuf, dev.Timeout, out _); + _dumpLog.WriteLine("Unlocking drive (Wxripper)."); + sense = _dev.KreonUnlockWxripper(out senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Cannot unlock drive, not continuing."); + _dumpLog.WriteLine("Cannot unlock drive, not continuing."); StoppingErrorMessage?.Invoke("Cannot unlock drive, not continuing."); return; } UpdateStatus?.Invoke("Getting disc size."); - dumpLog.WriteLine("Getting disc size."); - sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out _); + _dumpLog.WriteLine("Getting disc size."); + sense = _dev.ReadCapacity(out readBuffer, out senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Cannot get disc capacity."); + _dumpLog.WriteLine("Cannot get disc capacity."); StoppingErrorMessage?.Invoke("Cannot get disc capacity."); return; @@ -304,14 +304,14 @@ namespace DiscImageChef.Core.Devices.Dumping totalSize = (ulong)((readBuffer[0] << 24) + (readBuffer[1] << 16) + (readBuffer[2] << 8) + readBuffer[3]); UpdateStatus?.Invoke("Reading Physical Format Information."); - dumpLog.WriteLine("Reading Physical Format Information."); + _dumpLog.WriteLine("Reading Physical Format Information."); - sense = dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _); + sense = _dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.PhysicalInformation, 0, 0, out _); if(sense) { - dumpLog.WriteLine("Cannot get PFI."); + _dumpLog.WriteLine("Cannot get PFI."); StoppingErrorMessage?.Invoke("Cannot get PFI."); return; @@ -323,24 +323,25 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke($"WxRipper PFI's Data Area Start PSN: {wxRipperPfi.DataAreaStartPSN} sectors"); UpdateStatus?.Invoke($"WxRipper PFI's Layer 0 End PSN: {wxRipperPfi.Layer0EndPSN} sectors"); - dumpLog.WriteLine($"WxRipper PFI's Data Area Start PSN: {wxRipperPfi.DataAreaStartPSN} sectors"); - dumpLog.WriteLine($"WxRipper PFI's Layer 0 End PSN: {wxRipperPfi.Layer0EndPSN} sectors"); + _dumpLog.WriteLine($"WxRipper PFI's Data Area Start PSN: {wxRipperPfi.DataAreaStartPSN} sectors"); + _dumpLog.WriteLine($"WxRipper PFI's Layer 0 End PSN: {wxRipperPfi.Layer0EndPSN} sectors"); - ulong middleZone = totalSize - (wxRipperPfi.Layer0EndPSN - wxRipperPfi.DataAreaStartPSN + 1) - gameSize + 1; + ulong middleZone = + (totalSize - ((wxRipperPfi.Layer0EndPSN - wxRipperPfi.DataAreaStartPSN) + 1) - gameSize) + 1; tmpBuf = new byte[readBuffer.Length - 4]; Array.Copy(readBuffer, 4, tmpBuf, 0, readBuffer.Length - 4); mediaTags.Add(MediaTagType.Xbox_PFI, tmpBuf); UpdateStatus?.Invoke("Reading Disc Manufacturing Information."); - dumpLog.WriteLine("Reading Disc Manufacturing Information."); + _dumpLog.WriteLine("Reading Disc Manufacturing Information."); - sense = dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, - MmcDiscStructureFormat.DiscManufacturingInformation, 0, 0, out _); + sense = _dev.ReadDiscStructure(out readBuffer, out senseBuf, MmcDiscStructureMediaType.Dvd, 0, 0, + MmcDiscStructureFormat.DiscManufacturingInformation, 0, 0, out _); if(sense) { - dumpLog.WriteLine("Cannot get DMI."); + _dumpLog.WriteLine("Cannot get DMI."); StoppingErrorMessage?.Invoke("Cannot get DMI."); return; @@ -350,8 +351,8 @@ namespace DiscImageChef.Core.Devices.Dumping Array.Copy(readBuffer, 4, tmpBuf, 0, readBuffer.Length - 4); mediaTags.Add(MediaTagType.Xbox_DMI, tmpBuf); - totalSize = l0Video + l1Video + middleZone * 2 + gameSize; - ulong layerBreak = l0Video + middleZone + gameSize / 2; + totalSize = l0Video + l1Video + (middleZone * 2) + gameSize; + ulong layerBreak = l0Video + middleZone + (gameSize / 2); UpdateStatus?.Invoke($"Video layer 0 size: {l0Video} sectors"); UpdateStatus?.Invoke($"Video layer 1 size: {l1Video} sectors"); @@ -361,97 +362,97 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateStatus?.Invoke($"Real layer break: {layerBreak}"); UpdateStatus?.Invoke(""); - dumpLog.WriteLine("Video layer 0 size: {0} sectors", l0Video); - dumpLog.WriteLine("Video layer 1 size: {0} sectors", l1Video); - dumpLog.WriteLine("Middle zone 0 size: {0} sectors", middleZone); - dumpLog.WriteLine("Game data 0 size: {0} sectors", gameSize); - dumpLog.WriteLine("Total 0 size: {0} sectors", totalSize); - dumpLog.WriteLine("Real layer break: {0}", layerBreak); + _dumpLog.WriteLine("Video layer 0 size: {0} sectors", l0Video); + _dumpLog.WriteLine("Video layer 1 size: {0} sectors", l1Video); + _dumpLog.WriteLine("Middle zone 0 size: {0} sectors", middleZone); + _dumpLog.WriteLine("Game data 0 size: {0} sectors", gameSize); + _dumpLog.WriteLine("Total 0 size: {0} sectors", totalSize); + _dumpLog.WriteLine("Real layer break: {0}", layerBreak); - bool read12 = !dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, BLOCK_SIZE, 0, 1, - false, dev.Timeout, out _); + bool read12 = !_dev.Read12(out readBuffer, out senseBuf, 0, false, true, false, false, 0, BLOCK_SIZE, 0, 1, + false, _dev.Timeout, out _); if(!read12) { - dumpLog.WriteLine("Cannot read medium, aborting scan..."); + _dumpLog.WriteLine("Cannot read medium, aborting scan..."); StoppingErrorMessage?.Invoke("Cannot read medium, aborting scan..."); return; } - dumpLog.WriteLine("Using SCSI READ (12) command."); + _dumpLog.WriteLine("Using SCSI READ (12) command."); UpdateStatus?.Invoke("Using SCSI READ (12) command."); while(true) { if(read12) { - sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, 0, BLOCK_SIZE, 0, - blocksToRead, false, dev.Timeout, out _); + sense = _dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, 0, BLOCK_SIZE, 0, + blocksToRead, false, _dev.Timeout, out _); - if(sense || dev.Error) + if(sense || _dev.Error) blocksToRead /= 2; } - if(!dev.Error || + if(!_dev.Error || blocksToRead == 1) break; } - if(dev.Error) + if(_dev.Error) { - dumpLog.WriteLine("Device error {0} trying to guess ideal transfer length.", dev.LastError); - StoppingErrorMessage?.Invoke($"Device error {dev.LastError} trying to guess ideal transfer length."); + _dumpLog.WriteLine("Device error {0} trying to guess ideal transfer length.", _dev.LastError); + StoppingErrorMessage?.Invoke($"Device error {_dev.LastError} trying to guess ideal transfer length."); return; } - if(skip < blocksToRead) - skip = blocksToRead; + if(_skip < blocksToRead) + _skip = blocksToRead; bool ret = true; foreach(MediaTagType tag in mediaTags.Keys) { - if(outputPlugin.SupportedMediaTags.Contains(tag)) + if(_outputPlugin.SupportedMediaTags.Contains(tag)) continue; ret = false; - dumpLog.WriteLine($"Output format does not support {tag}."); + _dumpLog.WriteLine($"Output format does not support {tag}."); ErrorMessage?.Invoke($"Output format does not support {tag}."); } if(!ret) { - if(force) + if(_force) { - dumpLog.WriteLine("Several media tags not supported, continuing..."); + _dumpLog.WriteLine("Several media tags not supported, continuing..."); ErrorMessage?.Invoke("Several media tags not supported, continuing..."); } else { - dumpLog.WriteLine("Several media tags not supported, not continuing..."); + _dumpLog.WriteLine("Several media tags not supported, not continuing..."); StoppingErrorMessage?.Invoke("Several media tags not supported, not continuing..."); return; } } - dumpLog.WriteLine("Reading {0} sectors at a time.", blocksToRead); + _dumpLog.WriteLine("Reading {0} sectors at a time.", blocksToRead); UpdateStatus?.Invoke($"Reading {blocksToRead} sectors at a time."); - var mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, BLOCK_SIZE, blocksToRead); - var ibgLog = new IbgLog(outputPrefix + ".ibg", 0x0010); - ret = outputPlugin.Create(outputPath, dskType, formatOptions, blocks, BLOCK_SIZE); + var mhddLog = new MhddLog(_outputPrefix + ".mhddlog.bin", _dev, blocks, BLOCK_SIZE, blocksToRead); + var ibgLog = new IbgLog(_outputPrefix + ".ibg", 0x0010); + ret = _outputPlugin.Create(_outputPath, dskType, _formatOptions, blocks, BLOCK_SIZE); // Cannot create image if(!ret) { - dumpLog.WriteLine("Error creating output image, not continuing."); - dumpLog.WriteLine(outputPlugin.ErrorMessage); + _dumpLog.WriteLine("Error creating output image, not continuing."); + _dumpLog.WriteLine(_outputPlugin.ErrorMessage); StoppingErrorMessage?.Invoke("Error creating output image, not continuing." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } @@ -464,14 +465,14 @@ namespace DiscImageChef.Core.Devices.Dumping DumpHardwareType currentTry = null; ExtentsULong extents = null; - ResumeSupport.Process(true, true, totalSize, dev.Manufacturer, dev.Model, dev.Serial, dev.PlatformId, - ref resume, ref currentTry, ref extents); + ResumeSupport.Process(true, true, totalSize, _dev.Manufacturer, _dev.Model, _dev.Serial, _dev.PlatformId, + ref _resume, ref currentTry, ref extents); if(currentTry == null || extents == null) StoppingErrorMessage?.Invoke("Could not process resume file, not continuing..."); - (outputPlugin as IWritableOpticalImage).SetTracks(new List + (_outputPlugin as IWritableOpticalImage).SetTracks(new List { new Track { @@ -481,17 +482,17 @@ namespace DiscImageChef.Core.Devices.Dumping } }); - ulong currentSector = resume.NextBlock; + ulong currentSector = _resume.NextBlock; - if(resume.NextBlock > 0) + if(_resume.NextBlock > 0) { - UpdateStatus?.Invoke($"Resuming from block {resume.NextBlock}."); - dumpLog.WriteLine("Resuming from block {0}.", resume.NextBlock); + UpdateStatus?.Invoke($"Resuming from block {_resume.NextBlock}."); + _dumpLog.WriteLine("Resuming from block {0}.", _resume.NextBlock); } bool newTrim = false; - dumpLog.WriteLine("Reading game partition."); + _dumpLog.WriteLine("Reading game partition."); UpdateStatus?.Invoke("Reading game partition."); DateTime timeSpeedStart = DateTime.UtcNow; ulong sectorSpeedStart = 0; @@ -499,12 +500,12 @@ namespace DiscImageChef.Core.Devices.Dumping for(int e = 0; e <= 16; e++) { - if(aborted) + if(_aborted) { - resume.NextBlock = currentSector; + _resume.NextBlock = currentSector; currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -520,13 +521,13 @@ namespace DiscImageChef.Core.Devices.Dumping if(xboxSs.Value.Extents[e].StartPSN <= xboxSs.Value.Layer0EndPSN) extentStart = xboxSs.Value.Extents[e].StartPSN - 0x30000; else - extentStart = (xboxSs.Value.Layer0EndPSN + 1) * 2 - + extentStart = ((xboxSs.Value.Layer0EndPSN + 1) * 2) - ((xboxSs.Value.Extents[e].StartPSN ^ 0xFFFFFF) + 1) - 0x30000; if(xboxSs.Value.Extents[e].EndPSN <= xboxSs.Value.Layer0EndPSN) extentEnd = xboxSs.Value.Extents[e].EndPSN - 0x30000; else - extentEnd = (xboxSs.Value.Layer0EndPSN + 1) * 2 - + extentEnd = ((xboxSs.Value.Layer0EndPSN + 1) * 2) - ((xboxSs.Value.Extents[e].EndPSN ^ 0xFFFFFF) + 1) - 0x30000; } @@ -544,11 +545,11 @@ namespace DiscImageChef.Core.Devices.Dumping { saveBlocksToRead = blocksToRead; - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -569,45 +570,45 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateProgress?.Invoke($"Reading sector {i} of {totalSize} ({currentSpeed:F3} MiB/sec.)", (long)i, (long)totalSize); - sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)i, BLOCK_SIZE, - 0, blocksToRead, false, dev.Timeout, out cmdDuration); + sense = _dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)i, + BLOCK_SIZE, 0, blocksToRead, false, _dev.Timeout, out cmdDuration); totalDuration += cmdDuration; if(!sense && - !dev.Error) + !_dev.Error) { mhddLog.Write(i, cmdDuration); ibgLog.Write(i, currentSpeed * 1024); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(readBuffer, i, blocksToRead); + _outputPlugin.WriteSectors(readBuffer, i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(i, blocksToRead, true); } else { // TODO: Reset device after X errors - if(stopOnError) + if(_stopOnError) return; // TODO: Return more cleanly - if(i + skip > blocks) - skip = (uint)(blocks - i); + if(i + _skip > blocks) + _skip = (uint)(blocks - i); // Write empty data DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(new byte[BLOCK_SIZE * skip], i, skip); + _outputPlugin.WriteSectors(new byte[BLOCK_SIZE * _skip], i, _skip); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; - for(ulong b = i; b < i + skip; b++) - resume.BadBlocks.Add(b); + for(ulong b = i; b < i + _skip; b++) + _resume.BadBlocks.Add(b); DicConsole.DebugWriteLine("Dump-Media", "READ error:\n{0}", Sense.PrettifySense(senseBuf)); mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration); ibgLog.Write(i, 0); - dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", skip, i); - i += skip - blocksToRead; + _dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", _skip, i); + i += _skip - blocksToRead; string[] senseLines = Sense.PrettifySense(senseBuf).Split(new[] { @@ -615,22 +616,22 @@ namespace DiscImageChef.Core.Devices.Dumping }, StringSplitOptions.RemoveEmptyEntries); foreach(string senseLine in senseLines) - dumpLog.WriteLine(senseLine); + _dumpLog.WriteLine(senseLine); newTrim = true; } - blocksToRead = saveBlocksToRead; - currentSector = i + 1; - resume.NextBlock = currentSector; - sectorSpeedStart += blocksToRead; + blocksToRead = saveBlocksToRead; + currentSector = i + 1; + _resume.NextBlock = currentSector; + sectorSpeedStart += blocksToRead; double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; if(elapsed < 1) continue; - currentSpeed = sectorSpeedStart * BLOCK_SIZE / (1048576 * elapsed); + currentSpeed = (sectorSpeedStart * BLOCK_SIZE) / (1048576 * elapsed); sectorSpeedStart = 0; timeSpeedStart = DateTime.UtcNow; } @@ -639,11 +640,11 @@ namespace DiscImageChef.Core.Devices.Dumping { saveBlocksToRead = blocksToRead; - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -656,15 +657,15 @@ namespace DiscImageChef.Core.Devices.Dumping // Write empty data DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(new byte[BLOCK_SIZE * blocksToRead], i, blocksToRead); + _outputPlugin.WriteSectors(new byte[BLOCK_SIZE * blocksToRead], i, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; blocksToRead = saveBlocksToRead; extents.Add(i, blocksToRead, true); - currentSector = i + 1; - resume.NextBlock = currentSector; + currentSector = i + 1; + _resume.NextBlock = currentSector; } - if(!aborted) + if(!_aborted) currentSector = extentEnd + 1; } @@ -672,16 +673,16 @@ namespace DiscImageChef.Core.Devices.Dumping // Middle Zone D UpdateStatus?.Invoke("Writing Middle Zone D (empty)."); - dumpLog.WriteLine("Writing Middle Zone D (empty)."); + _dumpLog.WriteLine("Writing Middle Zone D (empty)."); InitProgress?.Invoke(); for(ulong middle = currentSector - blocks - 1; middle < middleZone - 1; middle += blocksToRead) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -698,12 +699,12 @@ namespace DiscImageChef.Core.Devices.Dumping // Write empty data DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(new byte[BLOCK_SIZE * blocksToRead], middle + currentSector, blocksToRead); - imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; + _outputPlugin.WriteSectors(new byte[BLOCK_SIZE * blocksToRead], middle + currentSector, blocksToRead); + imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(currentSector, blocksToRead, true); - currentSector += blocksToRead; - resume.NextBlock = currentSector; + currentSector += blocksToRead; + _resume.NextBlock = currentSector; } EndProgress?.Invoke(); @@ -711,18 +712,18 @@ namespace DiscImageChef.Core.Devices.Dumping blocksToRead = saveBlocksToRead; UpdateStatus?.Invoke("Locking drive."); - dumpLog.WriteLine("Locking drive."); - sense = dev.KreonLock(out senseBuf, dev.Timeout, out _); + _dumpLog.WriteLine("Locking drive."); + sense = _dev.KreonLock(out senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Cannot lock drive, not continuing."); + _dumpLog.WriteLine("Cannot lock drive, not continuing."); StoppingErrorMessage?.Invoke("Cannot lock drive, not continuing."); return; } - sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadCapacity(out readBuffer, out senseBuf, _dev.Timeout, out _); if(sense) { @@ -732,23 +733,23 @@ namespace DiscImageChef.Core.Devices.Dumping } // Video Layer 1 - dumpLog.WriteLine("Reading Video Layer 1."); + _dumpLog.WriteLine("Reading Video Layer 1."); UpdateStatus?.Invoke("Reading Video Layer 1."); InitProgress?.Invoke(); - for(ulong l1 = currentSector - blocks - middleZone + l0Video; l1 < l0Video + l1Video; l1 += blocksToRead) + for(ulong l1 = (currentSector - blocks - middleZone) + l0Video; l1 < l0Video + l1Video; l1 += blocksToRead) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } - if(l0Video + l1Video - l1 < blocksToRead) - blocksToRead = (uint)(l0Video + l1Video - l1); + if((l0Video + l1Video) - l1 < blocksToRead) + blocksToRead = (uint)((l0Video + l1Video) - l1); #pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator if(currentSpeed > maxSpeed && @@ -763,30 +764,30 @@ namespace DiscImageChef.Core.Devices.Dumping UpdateProgress?.Invoke($"Reading sector {currentSector} of {totalSize} ({currentSpeed:F3} MiB/sec.)", (long)currentSector, (long)totalSize); - sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)l1, BLOCK_SIZE, 0, - blocksToRead, false, dev.Timeout, out cmdDuration); + sense = _dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)l1, BLOCK_SIZE, + 0, blocksToRead, false, _dev.Timeout, out cmdDuration); totalDuration += cmdDuration; if(!sense && - !dev.Error) + !_dev.Error) { mhddLog.Write(currentSector, cmdDuration); ibgLog.Write(currentSector, currentSpeed * 1024); DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(readBuffer, currentSector, blocksToRead); + _outputPlugin.WriteSectors(readBuffer, currentSector, blocksToRead); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; extents.Add(currentSector, blocksToRead, true); } else { // TODO: Reset device after X errors - if(stopOnError) + if(_stopOnError) return; // TODO: Return more cleanly // Write empty data DateTime writeStart = DateTime.Now; - outputPlugin.WriteSectors(new byte[BLOCK_SIZE * skip], currentSector, skip); + _outputPlugin.WriteSectors(new byte[BLOCK_SIZE * _skip], currentSector, _skip); imageWriteDuration += (DateTime.Now - writeStart).TotalSeconds; // TODO: Handle errors in video partition @@ -796,8 +797,8 @@ namespace DiscImageChef.Core.Devices.Dumping mhddLog.Write(l1, cmdDuration < 500 ? 65535 : cmdDuration); ibgLog.Write(l1, 0); - dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", skip, l1); - l1 += skip - blocksToRead; + _dumpLog.WriteLine("Skipping {0} blocks from errored block {1}.", _skip, l1); + l1 += _skip - blocksToRead; string[] senseLines = Sense.PrettifySense(senseBuf).Split(new[] { @@ -805,19 +806,19 @@ namespace DiscImageChef.Core.Devices.Dumping }, StringSplitOptions.RemoveEmptyEntries); foreach(string senseLine in senseLines) - dumpLog.WriteLine(senseLine); + _dumpLog.WriteLine(senseLine); } - currentSector += blocksToRead; - resume.NextBlock = currentSector; - sectorSpeedStart += blocksToRead; + currentSector += blocksToRead; + _resume.NextBlock = currentSector; + sectorSpeedStart += blocksToRead; double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; if(elapsed < 1) continue; - currentSpeed = sectorSpeedStart * BLOCK_SIZE / (1048576 * elapsed); + currentSpeed = (sectorSpeedStart * BLOCK_SIZE) / (1048576 * elapsed); sectorSpeedStart = 0; timeSpeedStart = DateTime.UtcNow; } @@ -825,18 +826,18 @@ namespace DiscImageChef.Core.Devices.Dumping EndProgress?.Invoke(); UpdateStatus?.Invoke("Unlocking drive (Wxripper)."); - dumpLog.WriteLine("Unlocking drive (Wxripper)."); - sense = dev.KreonUnlockWxripper(out senseBuf, dev.Timeout, out _); + _dumpLog.WriteLine("Unlocking drive (Wxripper)."); + sense = _dev.KreonUnlockWxripper(out senseBuf, _dev.Timeout, out _); if(sense) { - dumpLog.WriteLine("Cannot unlock drive, not continuing."); + _dumpLog.WriteLine("Cannot unlock drive, not continuing."); StoppingErrorMessage?.Invoke("Cannot unlock drive, not continuing."); return; } - sense = dev.ReadCapacity(out readBuffer, out senseBuf, dev.Timeout, out _); + sense = _dev.ReadCapacity(out readBuffer, out senseBuf, _dev.Timeout, out _); if(sense) { @@ -849,79 +850,79 @@ namespace DiscImageChef.Core.Devices.Dumping DicConsole.WriteLine(); mhddLog.Close(); - ibgLog.Close(dev, blocks, BLOCK_SIZE, (end - start).TotalSeconds, currentSpeed * 1024, - BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalDuration / 1000), - devicePath); + ibgLog.Close(_dev, blocks, BLOCK_SIZE, (end - start).TotalSeconds, currentSpeed * 1024, + (BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalDuration / 1000), + _devicePath); UpdateStatus?.Invoke($"Dump finished in {(end - start).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average dump speed {(double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalDuration / 1000):F3} KiB/sec."); + Invoke($"Average dump speed {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalDuration / 1000):F3} KiB/sec."); UpdateStatus?. - Invoke($"Average write speed {(double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / imageWriteDuration:F3} KiB/sec."); + Invoke($"Average write speed {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / imageWriteDuration:F3} KiB/sec."); - dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Dump finished in {0} seconds.", (end - start).TotalSeconds); - dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", - (double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalDuration / 1000)); + _dumpLog.WriteLine("Average dump speed {0:F3} KiB/sec.", + ((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalDuration / 1000)); - dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", - (double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / imageWriteDuration); + _dumpLog.WriteLine("Average write speed {0:F3} KiB/sec.", + ((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / imageWriteDuration); #region Trimming - if(resume.BadBlocks.Count > 0 && - !aborted && - !notrim && + if(_resume.BadBlocks.Count > 0 && + !_aborted && + !_notrim && newTrim) { start = DateTime.UtcNow; UpdateStatus?.Invoke("Trimming bad sectors"); - dumpLog.WriteLine("Trimming bad sectors"); + _dumpLog.WriteLine("Trimming bad sectors"); - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); InitProgress?.Invoke(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } PulseProgress?.Invoke($"Trimming sector {badSector}"); - sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)badSector, - BLOCK_SIZE, 0, 1, false, dev.Timeout, out cmdDuration); + sense = _dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)badSector, + BLOCK_SIZE, 0, 1, false, _dev.Timeout, out cmdDuration); totalDuration += cmdDuration; - if(sense || dev.Error) + if(sense || _dev.Error) continue; - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); } EndProgress?.Invoke(); end = DateTime.UtcNow; UpdateStatus?.Invoke($"Trimmming finished in {(end - start).TotalSeconds} seconds."); - dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); + _dumpLog.WriteLine("Trimmming finished in {0} seconds.", (end - start).TotalSeconds); } #endregion Trimming #region Error handling - if(resume.BadBlocks.Count > 0 && - !aborted && - retryPasses > 0) + if(_resume.BadBlocks.Count > 0 && + !_aborted && + _retryPasses > 0) { List tmpList = new List(); - foreach(ulong ur in resume.BadBlocks) + foreach(ulong ur in _resume.BadBlocks) for(ulong i = ur; i < ur + blocksToRead; i++) tmpList.Add(i); @@ -931,22 +932,22 @@ namespace DiscImageChef.Core.Devices.Dumping bool forward = true; bool runningPersistent = false; - resume.BadBlocks = tmpList; + _resume.BadBlocks = tmpList; Modes.ModePage? currentModePage = null; byte[] md6; byte[] md10; - if(persistent) + if(_persistent) { Modes.ModePage_01_MMC pgMmc; - sense = dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, - dev.Timeout, out _); + sense = _dev.ModeSense6(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, + _dev.Timeout, out _); if(sense) { - sense = dev.ModeSense10(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, - dev.Timeout, out _); + sense = _dev.ModeSense10(out readBuffer, out _, false, ScsiModeSensePageControl.Current, 0x01, + _dev.Timeout, out _); if(!sense) { @@ -1001,15 +1002,15 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); - md10 = Modes.EncodeMode10(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); + md10 = Modes.EncodeMode10(md, _dev.ScsiType); UpdateStatus?.Invoke("Sending MODE SELECT to drive (return damaged blocks)."); - dumpLog.WriteLine("Sending MODE SELECT to drive (return damaged blocks)."); - sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _); + _dumpLog.WriteLine("Sending MODE SELECT to drive (return damaged blocks)."); + sense = _dev.ModeSelect(md6, out senseBuf, true, false, _dev.Timeout, out _); if(sense) - sense = dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); + sense = _dev.ModeSelect10(md10, out senseBuf, true, false, _dev.Timeout, out _); if(sense) { @@ -1018,7 +1019,7 @@ namespace DiscImageChef.Core.Devices.Dumping DicConsole.DebugWriteLine("Error: {0}", Sense.PrettifySense(senseBuf)); - dumpLog. + _dumpLog. WriteLine("Drive did not accept MODE SELECT command for persistent error reading, try another drive."); } else @@ -1027,15 +1028,15 @@ namespace DiscImageChef.Core.Devices.Dumping InitProgress?.Invoke(); repeatRetry: - ulong[] tmpArray = resume.BadBlocks.ToArray(); + ulong[] tmpArray = _resume.BadBlocks.ToArray(); foreach(ulong badSector in tmpArray) { - if(aborted) + if(_aborted) { currentTry.Extents = ExtentsConverter.ToMetadata(extents); UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); break; } @@ -1044,32 +1045,32 @@ namespace DiscImageChef.Core.Devices.Dumping forward ? "forward" : "reverse", runningPersistent ? "recovering partial data, " : "")); - sense = dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)badSector, - BLOCK_SIZE, 0, 1, false, dev.Timeout, out cmdDuration); + sense = _dev.Read12(out readBuffer, out senseBuf, 0, false, false, false, false, (uint)badSector, + BLOCK_SIZE, 0, 1, false, _dev.Timeout, out cmdDuration); totalDuration += cmdDuration; if(!sense && - !dev.Error) + !_dev.Error) { - resume.BadBlocks.Remove(badSector); + _resume.BadBlocks.Remove(badSector); extents.Add(badSector); - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); UpdateStatus?.Invoke($"Correctly retried block {badSector} in pass {pass}."); - dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); + _dumpLog.WriteLine("Correctly retried block {0} in pass {1}.", badSector, pass); } else if(runningPersistent) - outputPlugin.WriteSector(readBuffer, badSector); + _outputPlugin.WriteSector(readBuffer, badSector); } - if(pass < retryPasses && - !aborted && - resume.BadBlocks.Count > 0) + if(pass < _retryPasses && + !_aborted && + _resume.BadBlocks.Count > 0) { pass++; forward = !forward; - resume.BadBlocks.Sort(); - resume.BadBlocks.Reverse(); + _resume.BadBlocks.Sort(); + _resume.BadBlocks.Reverse(); goto repeatRetry; } @@ -1084,22 +1085,22 @@ namespace DiscImageChef.Core.Devices.Dumping } }; - md6 = Modes.EncodeMode6(md, dev.ScsiType); - md10 = Modes.EncodeMode10(md, dev.ScsiType); + md6 = Modes.EncodeMode6(md, _dev.ScsiType); + md10 = Modes.EncodeMode10(md, _dev.ScsiType); UpdateStatus?.Invoke("Sending MODE SELECT to drive (return device to previous status)."); - dumpLog.WriteLine("Sending MODE SELECT to drive (return device to previous status)."); - sense = dev.ModeSelect(md6, out senseBuf, true, false, dev.Timeout, out _); + _dumpLog.WriteLine("Sending MODE SELECT to drive (return device to previous status)."); + sense = _dev.ModeSelect(md6, out senseBuf, true, false, _dev.Timeout, out _); if(sense) - dev.ModeSelect10(md10, out senseBuf, true, false, dev.Timeout, out _); + _dev.ModeSelect10(md10, out senseBuf, true, false, _dev.Timeout, out _); } EndProgress?.Invoke(); } #endregion Error handling - resume.BadBlocks.Sort(); + _resume.BadBlocks.Sort(); currentTry.Extents = ExtentsConverter.ToMetadata(extents); foreach(KeyValuePair tag in mediaTags) @@ -1111,56 +1112,56 @@ namespace DiscImageChef.Core.Devices.Dumping continue; } - ret = outputPlugin.WriteMediaTag(tag.Value, tag.Key); + ret = _outputPlugin.WriteMediaTag(tag.Value, tag.Key); - if(ret || force) + if(ret || _force) continue; // Cannot write tag to image - dumpLog.WriteLine($"Cannot write tag {tag.Key}."); + _dumpLog.WriteLine($"Cannot write tag {tag.Key}."); StoppingErrorMessage?.Invoke($"Cannot write tag {tag.Key}." + Environment.NewLine + - outputPlugin.ErrorMessage); + _outputPlugin.ErrorMessage); return; } - resume.BadBlocks.Sort(); + _resume.BadBlocks.Sort(); - foreach(ulong bad in resume.BadBlocks) - dumpLog.WriteLine("Sector {0} could not be read.", bad); + foreach(ulong bad in _resume.BadBlocks) + _dumpLog.WriteLine("Sector {0} could not be read.", bad); currentTry.Extents = ExtentsConverter.ToMetadata(extents); - outputPlugin.SetDumpHardware(resume.Tries); + _outputPlugin.SetDumpHardware(_resume.Tries); - if(preSidecar != null) - outputPlugin.SetCicmMetadata(preSidecar); + if(_preSidecar != null) + _outputPlugin.SetCicmMetadata(_preSidecar); - dumpLog.WriteLine("Closing output file."); + _dumpLog.WriteLine("Closing output file."); UpdateStatus?.Invoke("Closing output file."); DateTime closeStart = DateTime.Now; - outputPlugin.Close(); + _outputPlugin.Close(); DateTime closeEnd = DateTime.Now; UpdateStatus?.Invoke($"Closed in {(closeEnd - closeStart).TotalSeconds} seconds."); - dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); + _dumpLog.WriteLine("Closed in {0} seconds.", (closeEnd - closeStart).TotalSeconds); - if(aborted) + if(_aborted) { UpdateStatus?.Invoke("Aborted!"); - dumpLog.WriteLine("Aborted!"); + _dumpLog.WriteLine("Aborted!"); return; } double totalChkDuration = 0; - if(!nometadata) + if(!_nometadata) { UpdateStatus?.Invoke("Creating sidecar."); - dumpLog.WriteLine("Creating sidecar."); + _dumpLog.WriteLine("Creating sidecar."); var filters = new FiltersList(); - IFilter filter = filters.GetFilter(outputPath); + IFilter filter = filters.GetFilter(_outputPath); IMediaImage inputPlugin = ImageFormat.Detect(filter); if(!inputPlugin.Open(filter)) @@ -1171,36 +1172,36 @@ namespace DiscImageChef.Core.Devices.Dumping } DateTime chkStart = DateTime.UtcNow; - sidecarClass = new Sidecar(inputPlugin, outputPath, filter.Id, encoding); - sidecarClass.InitProgressEvent += InitProgress; - sidecarClass.UpdateProgressEvent += UpdateProgress; - sidecarClass.EndProgressEvent += EndProgress; - sidecarClass.InitProgressEvent2 += InitProgress2; - sidecarClass.UpdateProgressEvent2 += UpdateProgress2; - sidecarClass.EndProgressEvent2 += EndProgress2; - sidecarClass.UpdateStatusEvent += UpdateStatus; - CICMMetadataType sidecar = sidecarClass.Create(); + _sidecarClass = new Sidecar(inputPlugin, _outputPath, filter.Id, _encoding); + _sidecarClass.InitProgressEvent += InitProgress; + _sidecarClass.UpdateProgressEvent += UpdateProgress; + _sidecarClass.EndProgressEvent += EndProgress; + _sidecarClass.InitProgressEvent2 += InitProgress2; + _sidecarClass.UpdateProgressEvent2 += UpdateProgress2; + _sidecarClass.EndProgressEvent2 += EndProgress2; + _sidecarClass.UpdateStatusEvent += UpdateStatus; + CICMMetadataType sidecar = _sidecarClass.Create(); end = DateTime.UtcNow; - if(preSidecar != null) + if(_preSidecar != null) { - preSidecar.OpticalDisc = sidecar.OpticalDisc; - sidecar = preSidecar; + _preSidecar.OpticalDisc = sidecar.OpticalDisc; + sidecar = _preSidecar; } totalChkDuration = (end - chkStart).TotalMilliseconds; UpdateStatus?.Invoke($"Sidecar created in {(end - chkStart).TotalSeconds} seconds."); UpdateStatus?. - Invoke($"Average checksum speed {(double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); + Invoke($"Average checksum speed {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000):F3} KiB/sec."); - dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); + _dumpLog.WriteLine("Sidecar created in {0} seconds.", (end - chkStart).TotalSeconds); - dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", - (double)BLOCK_SIZE * (double)(blocks + 1) / 1024 / (totalChkDuration / 1000)); + _dumpLog.WriteLine("Average checksum speed {0:F3} KiB/sec.", + ((double)BLOCK_SIZE * (double)(blocks + 1)) / 1024 / (totalChkDuration / 1000)); foreach(KeyValuePair tag in mediaTags) - AddMediaTagToSidecar(outputPath, tag, ref sidecar); + AddMediaTagToSidecar(_outputPath, tag, ref sidecar); List<(ulong start, string type)> filesystems = new List<(ulong start, string type)>(); @@ -1218,7 +1219,7 @@ namespace DiscImageChef.Core.Devices.Dumping }).Distinct()) { UpdateStatus?.Invoke($"Found filesystem {filesystem.type} at sector {filesystem.start}"); - dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); + _dumpLog.WriteLine("Found filesystem {0} at sector {1}", filesystem.type, filesystem.start); } sidecar.OpticalDisc[0].Layers = new LayersType @@ -1240,12 +1241,12 @@ namespace DiscImageChef.Core.Devices.Dumping sidecar.OpticalDisc[0].DiscSubType = xmlType.subType; foreach(KeyValuePair tag in mediaTags) - if(outputPlugin.SupportedMediaTags.Contains(tag.Key)) - AddMediaTagToSidecar(outputPath, tag, ref sidecar); + if(_outputPlugin.SupportedMediaTags.Contains(tag.Key)) + AddMediaTagToSidecar(_outputPath, tag, ref sidecar); UpdateStatus?.Invoke("Writing metadata sidecar"); - var xmlFs = new FileStream(outputPrefix + ".cicm.xml", FileMode.Create); + var xmlFs = new FileStream(_outputPrefix + ".cicm.xml", FileMode.Create); var xmlSer = new XmlSerializer(typeof(CICMMetadataType)); xmlSer.Serialize(xmlFs, sidecar); @@ -1258,11 +1259,11 @@ namespace DiscImageChef.Core.Devices.Dumping Invoke($"Took a total of {(end - start).TotalSeconds:F3} seconds ({totalDuration / 1000:F3} processing commands, {totalChkDuration / 1000:F3} checksumming, {imageWriteDuration:F3} writing, {(closeEnd - closeStart).TotalSeconds:F3} closing)."); UpdateStatus?. - Invoke($"Average speed: {(double)BLOCK_SIZE * (double)(blocks + 1) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); + Invoke($"Average speed: {((double)BLOCK_SIZE * (double)(blocks + 1)) / 1048576 / (totalDuration / 1000):F3} MiB/sec."); UpdateStatus?.Invoke($"Fastest speed burst: {maxSpeed:F3} MiB/sec."); UpdateStatus?.Invoke($"Slowest speed burst: {minSpeed:F3} MiB/sec."); - UpdateStatus?.Invoke($"{resume.BadBlocks.Count} sectors could not be read."); + UpdateStatus?.Invoke($"{_resume.BadBlocks.Count} sectors could not be read."); UpdateStatus?.Invoke(""); Statistics.AddMedia(dskType, true); diff --git a/DiscImageChef.Gui/Forms/frmDump.xeto.cs b/DiscImageChef.Gui/Forms/frmDump.xeto.cs index 5fc5401d4..1ea0c9365 100644 --- a/DiscImageChef.Gui/Forms/frmDump.xeto.cs +++ b/DiscImageChef.Gui/Forms/frmDump.xeto.cs @@ -54,16 +54,18 @@ using Schemas; using DeviceInfo = DiscImageChef.Core.Devices.Info.DeviceInfo; using MediaType = DiscImageChef.CommonTypes.MediaType; +// ReSharper disable UnusedMember.Local + namespace DiscImageChef.Gui.Forms { public class frmDump : Form { - readonly string devicePath; - Device dev; - Dump dumper; - string outputPrefix; - Resume resume; - CICMMetadataType sidecar; + readonly string _devicePath; + Device _dev; + Dump _dumper; + string _outputPrefix; + Resume _resume; + CICMMetadataType _sidecar; public frmDump(string devicePath, DeviceInfo deviceInfo, ScsiInfo scsiInfo = null) { @@ -189,7 +191,7 @@ namespace DiscImageChef.Gui.Forms break; } - this.devicePath = devicePath; + _devicePath = devicePath; } void OnCmbFormatSelectedIndexChanged(object sender, EventArgs e) @@ -318,7 +320,7 @@ namespace DiscImageChef.Gui.Forms if(result != DialogResult.Ok) { txtDestination.Text = ""; - outputPrefix = null; + _outputPrefix = null; return; } @@ -328,8 +330,8 @@ namespace DiscImageChef.Gui.Forms txtDestination.Text = dlgDestination.FileName; - outputPrefix = Path.Combine(Path.GetDirectoryName(dlgDestination.FileName), - Path.GetFileNameWithoutExtension(dlgDestination.FileName)); + _outputPrefix = Path.Combine(Path.GetDirectoryName(dlgDestination.FileName), + Path.GetFileNameWithoutExtension(dlgDestination.FileName)); chkResume.Checked = true; } @@ -344,7 +346,7 @@ namespace DiscImageChef.Gui.Forms { if(chkExistingMetadata.Checked == false) { - sidecar = null; + _sidecar = null; return; } @@ -370,7 +372,7 @@ namespace DiscImageChef.Gui.Forms try { var sr = new StreamReader(dlgMetadata.FileName); - sidecar = (CICMMetadataType)sidecarXs.Deserialize(sr); + _sidecar = (CICMMetadataType)sidecarXs.Deserialize(sr); sr.Close(); } catch @@ -385,19 +387,19 @@ namespace DiscImageChef.Gui.Forms if(chkResume.Checked == false) return; - if(outputPrefix != null) + if(_outputPrefix != null) CheckResumeFile(); } void CheckResumeFile() { - resume = null; + _resume = null; var xs = new XmlSerializer(typeof(Resume)); try { - var sr = new StreamReader(outputPrefix + ".resume.xml"); - resume = (Resume)xs.Deserialize(sr); + var sr = new StreamReader(_outputPrefix + ".resume.xml"); + _resume = (Resume)xs.Deserialize(sr); sr.Close(); } catch @@ -408,9 +410,9 @@ namespace DiscImageChef.Gui.Forms return; } - if(resume == null || - resume.NextBlock <= resume.LastBlock || - (resume.BadBlocks.Count != 0 && !resume.Tape)) + if(_resume == null || + _resume.NextBlock <= _resume.LastBlock || + (_resume.BadBlocks.Count != 0 && !_resume.Tape)) return; MessageBox.Show("Media already dumped correctly, please choose another destination...", @@ -424,7 +426,7 @@ namespace DiscImageChef.Gui.Forms void OnBtnStopClick(object sender, EventArgs e) { btnStop.Enabled = false; - dumper.Abort(); + _dumper.Abort(); } void OnBtnDumpClick(object sender, EventArgs e) @@ -442,15 +444,15 @@ namespace DiscImageChef.Gui.Forms try { - dev = new Device(devicePath); + _dev = new Device(_devicePath); - if(dev.IsRemote) - Statistics.AddRemote(dev.RemoteApplication, dev.RemoteVersion, dev.RemoteOperatingSystem, - dev.RemoteOperatingSystemVersion, dev.RemoteArchitecture); + if(_dev.IsRemote) + Statistics.AddRemote(_dev.RemoteApplication, _dev.RemoteVersion, _dev.RemoteOperatingSystem, + _dev.RemoteOperatingSystemVersion, _dev.RemoteArchitecture); - if(dev.Error) + if(_dev.Error) { - StoppingErrorMessage($"Error {dev.LastError} opening device."); + StoppingErrorMessage($"Error {_dev.LastError} opening device."); return; } @@ -462,7 +464,7 @@ namespace DiscImageChef.Gui.Forms return; } - Statistics.AddDevice(dev); + Statistics.AddDevice(_dev); Statistics.AddCommand("dump-media"); if(!(cmbFormat.SelectedValue is IWritableImage outputFormat)) @@ -515,36 +517,37 @@ namespace DiscImageChef.Gui.Forms parsedOptions.Add(key, value); } - var dumpLog = new DumpLog(outputPrefix + ".log", dev); + var dumpLog = new DumpLog(_outputPrefix + ".log", _dev); dumpLog.WriteLine("Output image format: {0}.", outputFormat.Name); - dumper = new Dump(chkResume.Checked == true, dev, devicePath, outputFormat, (ushort)stpRetries.Value, - chkForce.Checked == true, false, chkPersistent.Checked == true, - chkStopOnError.Checked == true, resume, dumpLog, encoding, outputPrefix, - txtDestination.Text, parsedOptions, sidecar, (uint)stpSkipped.Value, - chkExistingMetadata.Checked == false, chkTrim.Checked == false, - chkTrack1Pregap.Checked == true); + _dumper = new Dump(chkResume.Checked == true, _dev, _devicePath, outputFormat, + (ushort)stpRetries.Value, + chkForce.Checked == true, false, chkPersistent.Checked == true, + chkStopOnError.Checked == true, _resume, dumpLog, encoding, _outputPrefix, + txtDestination.Text, parsedOptions, _sidecar, (uint)stpSkipped.Value, + chkExistingMetadata.Checked == false, chkTrim.Checked == false, + chkTrack1Pregap.Checked == true); new Thread(DoWork).Start(); } void DoWork() { - dumper.UpdateStatus += UpdateStatus; - dumper.ErrorMessage += ErrorMessage; - dumper.StoppingErrorMessage += StoppingErrorMessage; - dumper.PulseProgress += PulseProgress; - dumper.InitProgress += InitProgress; - dumper.UpdateProgress += UpdateProgress; - dumper.EndProgress += EndProgress; - dumper.InitProgress2 += InitProgress2; - dumper.UpdateProgress2 += UpdateProgress2; - dumper.EndProgress2 += EndProgress2; + _dumper.UpdateStatus += UpdateStatus; + _dumper.ErrorMessage += ErrorMessage; + _dumper.StoppingErrorMessage += StoppingErrorMessage; + _dumper.PulseProgress += PulseProgress; + _dumper.InitProgress += InitProgress; + _dumper.UpdateProgress += UpdateProgress; + _dumper.EndProgress += EndProgress; + _dumper.InitProgress2 += InitProgress2; + _dumper.UpdateProgress2 += UpdateProgress2; + _dumper.EndProgress2 += EndProgress2; - dumper.Start(); + _dumper.Start(); - dev.Close(); + _dev.Close(); WorkFinished(); } @@ -643,6 +646,7 @@ namespace DiscImageChef.Gui.Forms } #region XAML IDs + // ReSharper disable InconsistentNaming ComboBox cmbFormat; TextBox txtDestination; Button btnDestination; @@ -673,6 +677,8 @@ namespace DiscImageChef.Gui.Forms Label lblProgress2; ProgressBar prgProgress2; StackLayout stkOptions; + + // ReSharper restore InconsistentNaming #endregion } } \ No newline at end of file diff --git a/DiscImageChef.sln.DotSettings b/DiscImageChef.sln.DotSettings index ffbe0c6c4..12e24a480 100644 --- a/DiscImageChef.sln.DotSettings +++ b/DiscImageChef.sln.DotSettings @@ -190,6 +190,7 @@ True True True + True True True True diff --git a/DiscImageChef/Commands/DumpMedia.cs b/DiscImageChef/Commands/DumpMedia.cs index 3d7a629d8..4e3d78190 100644 --- a/DiscImageChef/Commands/DumpMedia.cs +++ b/DiscImageChef/Commands/DumpMedia.cs @@ -52,81 +52,77 @@ using PlatformID = DiscImageChef.CommonTypes.Interop.PlatformID; namespace DiscImageChef.Commands { + // TODO: Add raw dumping internal class DumpMediaCommand : Command { - string cicmXml; - string devicePath; - bool doResume = true; - string encodingName; - bool firstTrackPregap; - bool force; - bool noMetadata; - bool noTrim; - string outputFile; - string outputOptions; - - bool persistent; - - // TODO: Add raw dumping - ushort retryPasses = 5; - bool showHelp; - int skip = 512; - bool stopOnError; - string wantedOutputFormat; + string _cicmXml; + string _devicePath; + bool _doResume = true; + string _encodingName; + bool _firstTrackPregap; + bool _force; + bool _noMetadata; + bool _noTrim; + string _outputFile; + string _outputOptions; + bool _persistent; + ushort _retryPasses = 5; + bool _showHelp; + int _skip = 512; + bool _stopOnError; + string _wantedOutputFormat; public DumpMediaCommand() : base("dump-media", "Dumps the media inserted on a device to a media image.") { Options = new OptionSet { $"{MainClass.AssemblyTitle} {MainClass.AssemblyVersion?.InformationalVersion}", - $"{MainClass.AssemblyCopyright}", "", $"usage: DiscImageChef {Name} [OPTIONS] devicepath outputimage", + $"{MainClass.AssemblyCopyright}", "", $"usage: DiscImageChef {Name} [OPTIONS] device_path output_image", "", Help, { - "cicm-xml|x=", "Take metadata from existing CICM XML sidecar.", s => cicmXml = s + "cicm-xml|x=", "Take metadata from existing CICM XML sidecar.", s => _cicmXml = s }, { - "encoding|e=", "Name of character encoding to use.", s => encodingName = s + "encoding|e=", "Name of character encoding to use.", s => _encodingName = s } }; if(DetectOS.GetRealPlatformID() != PlatformID.FreeBSD) Options.Add("first-pregap", "Try to read first track pregap. Only applicable to CD/DDCD/GD.", - b => firstTrackPregap = b != null); + b => _firstTrackPregap = b != null); - Options.Add("force|f", "Continue dump whatever happens.", b => force = b != null); + Options.Add("force|f", "Continue dump whatever happens.", b => _force = b != null); Options.Add("format|t=", "Format of the output image, as plugin name or plugin id. If not present, will try to detect it from output image extension.", - s => wantedOutputFormat = s); + s => _wantedOutputFormat = s); - Options.Add("no-metadata", "Disables creating CICM XML sidecar.", b => noMetadata = b != null); - Options.Add("no-trim", "Disables trimming errored from skipped sectors.", b => noTrim = b != null); + Options.Add("no-metadata", "Disables creating CICM XML sidecar.", b => _noMetadata = b != null); + Options.Add("no-trim", "Disables trimming errored from skipped sectors.", b => _noTrim = b != null); Options.Add("options|O=", "Comma separated name=value pairs of options to pass to output image plugin.", - s => outputOptions = s); + s => _outputOptions = s); - Options.Add("persistent", "Try to recover partial or incorrect data.", b => persistent = b != null); + Options.Add("persistent", "Try to recover partial or incorrect data.", b => _persistent = b != null); + + Options.Add("resume|r", "Create/use resume mapfile.", b => _doResume = b != null); + + Options.Add("retry-passes|p=", "How many retry passes to do.", (ushort us) => _retryPasses = us); + Options.Add("skip|k=", "When an unreadable sector is found skip this many sectors.", (int i) => _skip = i); + + Options.Add("stop-on-error|s", "Stop media dump on first error.", b => _stopOnError = b != null); + + Options.Add("help|h|?", "Show this message and exit.", v => _showHelp = v != null); /* TODO: Disabled temporarily Options.Add("raw|r", "Dump sectors with tags included. For optical media, dump scrambled sectors.", (b) => raw = b != null);*/ - Options.Add("resume|r", "Create/use resume mapfile.", - b => doResume = b != null); - - Options.Add("retry-passes|p=", "How many retry passes to do.", (ushort us) => retryPasses = us); - Options.Add("skip|k=", "When an unreadable sector is found skip this many sectors.", (int i) => skip = i); - - Options.Add("stop-on-error|s", "Stop media dump on first error.", - b => stopOnError = b != null); - - Options.Add("help|h|?", "Show this message and exit.", - v => showHelp = v != null); } public override int Invoke(IEnumerable arguments) { List extra = Options.Parse(arguments); - if(showHelp) + if(_showHelp) { Options.WriteOptionDescriptions(CommandSet.Out); @@ -157,31 +153,31 @@ namespace DiscImageChef.Commands return(int)ErrorNumber.MissingArgument; } - devicePath = extra[0]; - outputFile = extra[1]; + _devicePath = extra[0]; + _outputFile = extra[1]; - DicConsole.DebugWriteLine("Dump-Media command", "--cicm-xml={0}", cicmXml); + DicConsole.DebugWriteLine("Dump-Media command", "--cicm-xml={0}", _cicmXml); DicConsole.DebugWriteLine("Dump-Media command", "--debug={0}", MainClass.Debug); - DicConsole.DebugWriteLine("Dump-Media command", "--device={0}", devicePath); - DicConsole.DebugWriteLine("Dump-Media command", "--encoding={0}", encodingName); - DicConsole.DebugWriteLine("Dump-Media command", "--first-pregap={0}", firstTrackPregap); - DicConsole.DebugWriteLine("Dump-Media command", "--force={0}", force); - DicConsole.DebugWriteLine("Dump-Media command", "--force={0}", force); - DicConsole.DebugWriteLine("Dump-Media command", "--format={0}", wantedOutputFormat); - DicConsole.DebugWriteLine("Dump-Media command", "--no-metadata={0}", noMetadata); + DicConsole.DebugWriteLine("Dump-Media command", "--device={0}", _devicePath); + DicConsole.DebugWriteLine("Dump-Media command", "--encoding={0}", _encodingName); + DicConsole.DebugWriteLine("Dump-Media command", "--first-pregap={0}", _firstTrackPregap); + DicConsole.DebugWriteLine("Dump-Media command", "--force={0}", _force); + DicConsole.DebugWriteLine("Dump-Media command", "--force={0}", _force); + DicConsole.DebugWriteLine("Dump-Media command", "--format={0}", _wantedOutputFormat); + DicConsole.DebugWriteLine("Dump-Media command", "--no-metadata={0}", _noMetadata); DicConsole.DebugWriteLine("Dump-Media command", "--options={0}", Options); - DicConsole.DebugWriteLine("Dump-Media command", "--output={0}", outputFile); - DicConsole.DebugWriteLine("Dump-Media command", "--persistent={0}", persistent); + DicConsole.DebugWriteLine("Dump-Media command", "--output={0}", _outputFile); + DicConsole.DebugWriteLine("Dump-Media command", "--persistent={0}", _persistent); + DicConsole.DebugWriteLine("Dump-Media command", "--resume={0}", _doResume); + DicConsole.DebugWriteLine("Dump-Media command", "--retry-passes={0}", _retryPasses); + DicConsole.DebugWriteLine("Dump-Media command", "--skip={0}", _skip); + DicConsole.DebugWriteLine("Dump-Media command", "--stop-on-error={0}", _stopOnError); + DicConsole.DebugWriteLine("Dump-Media command", "--verbose={0}", MainClass.Verbose); // TODO: Disabled temporarily //DicConsole.DebugWriteLine("Dump-Media command", "--raw={0}", raw); - DicConsole.DebugWriteLine("Dump-Media command", "--resume={0}", doResume); - DicConsole.DebugWriteLine("Dump-Media command", "--retry-passes={0}", retryPasses); - DicConsole.DebugWriteLine("Dump-Media command", "--skip={0}", skip); - DicConsole.DebugWriteLine("Dump-Media command", "--stop-on-error={0}", stopOnError); - DicConsole.DebugWriteLine("Dump-Media command", "--verbose={0}", MainClass.Verbose); - Dictionary parsedOptions = Core.Options.Parse(outputOptions); + Dictionary parsedOptions = Core.Options.Parse(_outputOptions); DicConsole.DebugWriteLine("Dump-Media command", "Parsed options:"); foreach(KeyValuePair parsedOption in parsedOptions) @@ -189,10 +185,10 @@ namespace DiscImageChef.Commands Encoding encoding = null; - if(encodingName != null) + if(_encodingName != null) try { - encoding = Claunia.Encoding.Encoding.GetEncoding(encodingName); + encoding = Claunia.Encoding.Encoding.GetEncoding(_encodingName); if(MainClass.Verbose) DicConsole.VerboseWriteLine("Using encoding for {0}.", encoding.EncodingName); @@ -204,17 +200,17 @@ namespace DiscImageChef.Commands return(int)ErrorNumber.EncodingUnknown; } - if(devicePath.Length == 2 && - devicePath[1] == ':' && - devicePath[0] != '/' && - char.IsLetter(devicePath[0])) - devicePath = "\\\\.\\" + char.ToUpper(devicePath[0]) + ':'; + if(_devicePath.Length == 2 && + _devicePath[1] == ':' && + _devicePath[0] != '/' && + char.IsLetter(_devicePath[0])) + _devicePath = "\\\\.\\" + char.ToUpper(_devicePath[0]) + ':'; Device dev; try { - dev = new Device(devicePath); + dev = new Device(_devicePath); if(dev.IsRemote) Statistics.AddRemote(dev.RemoteApplication, dev.RemoteVersion, dev.RemoteOperatingSystem, @@ -236,13 +232,13 @@ namespace DiscImageChef.Commands Statistics.AddDevice(dev); - string outputPrefix = Path.Combine(Path.GetDirectoryName(outputFile), - Path.GetFileNameWithoutExtension(outputFile)); + string outputPrefix = Path.Combine(Path.GetDirectoryName(_outputFile), + Path.GetFileNameWithoutExtension(_outputFile)); Resume resume = null; var xs = new XmlSerializer(typeof(Resume)); - if(File.Exists(outputPrefix + ".resume.xml") && doResume) + if(File.Exists(outputPrefix + ".resume.xml") && _doResume) try { var sr = new StreamReader(outputPrefix + ".resume.xml"); @@ -269,12 +265,12 @@ namespace DiscImageChef.Commands CICMMetadataType sidecar = null; var sidecarXs = new XmlSerializer(typeof(CICMMetadataType)); - if(cicmXml != null) - if(File.Exists(cicmXml)) + if(_cicmXml != null) + if(File.Exists(_cicmXml)) { try { - var sr = new StreamReader(cicmXml); + var sr = new StreamReader(_cicmXml); sidecar = (CICMMetadataType)sidecarXs.Deserialize(sr); sr.Close(); } @@ -296,18 +292,19 @@ namespace DiscImageChef.Commands List candidates = new List(); // Try extension - if(string.IsNullOrEmpty(wantedOutputFormat)) + if(string.IsNullOrEmpty(_wantedOutputFormat)) candidates.AddRange(plugins.WritableImages.Values.Where(t => t.KnownExtensions. - Contains(Path.GetExtension(outputFile)))); + Contains(Path. + GetExtension(_outputFile)))); // Try Id - else if(Guid.TryParse(wantedOutputFormat, out Guid outId)) + else if(Guid.TryParse(_wantedOutputFormat, out Guid outId)) candidates.AddRange(plugins.WritableImages.Values.Where(t => t.Id.Equals(outId))); // Try name else - candidates.AddRange(plugins.WritableImages.Values.Where(t => string.Equals(t.Name, wantedOutputFormat, + candidates.AddRange(plugins.WritableImages.Values.Where(t => string.Equals(t.Name, _wantedOutputFormat, StringComparison. InvariantCultureIgnoreCase))); @@ -340,9 +337,9 @@ namespace DiscImageChef.Commands DicConsole.WriteLine("Output image format: {0}.", outputFormat.Name); } - var dumper = new Dump(doResume, dev, devicePath, outputFormat, retryPasses, force, false, persistent, - stopOnError, resume, dumpLog, encoding, outputPrefix, outputFile, parsedOptions, - sidecar, (uint)skip, noMetadata, noTrim, firstTrackPregap); + var dumper = new Dump(_doResume, dev, _devicePath, outputFormat, _retryPasses, _force, false, _persistent, + _stopOnError, resume, dumpLog, encoding, outputPrefix, _outputFile, parsedOptions, + sidecar, (uint)_skip, _noMetadata, _noTrim, _firstTrackPregap); dumper.UpdateStatus += Progress.UpdateStatus; dumper.ErrorMessage += Progress.ErrorMessage;