Save tape partitions when dumping SSC media.

This commit is contained in:
2019-04-30 23:49:36 +01:00
parent 05bc4f4216
commit 743eefae4a

View File

@@ -31,7 +31,6 @@
// ****************************************************************************/ // ****************************************************************************/
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Threading; using System.Threading;
using System.Xml.Serialization; using System.Xml.Serialization;
@@ -293,7 +292,6 @@ namespace DiscImageChef.Core.Devices.Dumping
byte currentPartition = 0; byte currentPartition = 0;
byte totalPartitions = 1; // TODO: Handle partitions. byte totalPartitions = 1; // TODO: Handle partitions.
ulong currentSize = 0; ulong currentSize = 0;
ulong currentPartitionSize = 0;
bool fixedLen = false; bool fixedLen = false;
uint transferLen = blockSize; uint transferLen = blockSize;
@@ -409,8 +407,6 @@ namespace DiscImageChef.Core.Devices.Dumping
return; return;
} }
List<TapePartitionType> partitions = new List<TapePartitionType>();
Checksum dataChk = new Checksum(); Checksum dataChk = new Checksum();
start = DateTime.UtcNow; start = DateTime.UtcNow;
MhddLog mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, 1); MhddLog mhddLog = new MhddLog(outputPrefix + ".mhddlog.bin", dev, blocks, blockSize, 1);
@@ -418,21 +414,8 @@ namespace DiscImageChef.Core.Devices.Dumping
TapeFile currentTapeFile = TapeFile currentTapeFile =
new TapeFile {File = currentFile, FirstBlock = currentBlock, Partition = currentPartition}; new TapeFile {File = currentFile, FirstBlock = currentBlock, Partition = currentPartition};
TapePartition currentTapePartition =
Checksum fileChk = new Checksum(); new TapePartition {Number = currentPartition, FirstBlock = currentBlock};
TapePartitionType currentTapePartition = new TapePartitionType
{
Image = new ImageType
{
format = "BINARY",
offset = currentSize,
offsetSpecified = true,
Value = outputPrefix + ".bin"
},
Sequence = currentPartition,
StartBlock = currentBlock
};
Checksum partitionChk = new Checksum();
DateTime timeSpeedStart = DateTime.UtcNow; DateTime timeSpeedStart = DateTime.UtcNow;
ulong currentSpeedSize = 0; ulong currentSpeedSize = 0;
@@ -455,10 +438,8 @@ namespace DiscImageChef.Core.Devices.Dumping
currentTapeFile.LastBlock = currentBlock - 1; currentTapeFile.LastBlock = currentBlock - 1;
(outputPlugin as IWritableTapeImage).AddFile(currentTapeFile); (outputPlugin as IWritableTapeImage).AddFile(currentTapeFile);
currentTapePartition.Checksums = partitionChk.End().ToArray(); currentTapePartition.LastBlock = currentBlock - 1;
currentTapePartition.EndBlock = currentBlock - 1; (outputPlugin as IWritableTapeImage).AddPartition(currentTapePartition);
currentTapePartition.Size = currentPartitionSize;
partitions.Add(currentTapePartition);
currentPartition++; currentPartition++;
@@ -469,21 +450,7 @@ namespace DiscImageChef.Core.Devices.Dumping
{ {
File = currentFile, FirstBlock = currentBlock, Partition = currentPartition File = currentFile, FirstBlock = currentBlock, Partition = currentPartition
}; };
fileChk = new Checksum(); currentTapePartition = new TapePartition {Number = currentPartition, FirstBlock = currentBlock};
currentTapePartition = new TapePartitionType
{
Image = new ImageType
{
format = "BINARY",
offset = currentSize,
offsetSpecified = true,
Value = outputPrefix + ".bin"
},
Sequence = currentPartition,
StartBlock = currentBlock
};
currentPartitionSize = 0;
partitionChk = new Checksum();
UpdateStatus?.Invoke($"Seeking to partition {currentPartition}"); 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; totalDuration += duration;
@@ -582,7 +549,6 @@ namespace DiscImageChef.Core.Devices.Dumping
{ {
File = currentFile, FirstBlock = currentBlock, Partition = currentPartition File = currentFile, FirstBlock = currentBlock, Partition = currentPartition
}; };
fileChk = new Checksum();
UpdateStatus?.Invoke($"Changed to file {currentFile} at block {currentBlock}"); 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);
@@ -605,15 +571,12 @@ namespace DiscImageChef.Core.Devices.Dumping
DateTime chkStart = DateTime.UtcNow; DateTime chkStart = DateTime.UtcNow;
dataChk.Update(cmdBuf); dataChk.Update(cmdBuf);
fileChk.Update(cmdBuf);
partitionChk.Update(cmdBuf);
DateTime chkEnd = DateTime.UtcNow; DateTime chkEnd = DateTime.UtcNow;
double chkDuration = (chkEnd - chkStart).TotalMilliseconds; double chkDuration = (chkEnd - chkStart).TotalMilliseconds;
totalChkDuration += chkDuration; totalChkDuration += chkDuration;
currentBlock++; currentBlock++;
currentSize += blockSize; currentSize += blockSize;
currentPartitionSize += blockSize;
currentSpeedSize += blockSize; currentSpeedSize += blockSize;
double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds;
@@ -628,6 +591,8 @@ namespace DiscImageChef.Core.Devices.Dumping
currentTapeFile.LastBlock = currentBlock - 1; currentTapeFile.LastBlock = currentBlock - 1;
(outputPlugin as IWritableTapeImage).AddFile(currentTapeFile); (outputPlugin as IWritableTapeImage).AddFile(currentTapeFile);
currentTapePartition.LastBlock = currentBlock - 1;
(outputPlugin as IWritableTapeImage).AddPartition(currentTapePartition);
dumpLog.WriteLine("Closing output file."); dumpLog.WriteLine("Closing output file.");
UpdateStatus?.Invoke("Closing output file."); UpdateStatus?.Invoke("Closing output file.");
@@ -678,7 +643,6 @@ namespace DiscImageChef.Core.Devices.Dumping
sidecar.BlockMedia[0].DumpHardwareArray[0].Revision = dev.Revision; sidecar.BlockMedia[0].DumpHardwareArray[0].Revision = dev.Revision;
sidecar.BlockMedia[0].DumpHardwareArray[0].Serial = dev.Serial; sidecar.BlockMedia[0].DumpHardwareArray[0].Serial = dev.Serial;
sidecar.BlockMedia[0].DumpHardwareArray[0].Software = Version.GetSoftwareType(); sidecar.BlockMedia[0].DumpHardwareArray[0].Software = Version.GetSoftwareType();
sidecar.BlockMedia[0].TapeInformation = partitions.ToArray();
if(!aborted) if(!aborted)
{ {