Use Aaru Metadata instead of CICM Metadata.

This commit is contained in:
2022-12-15 22:21:07 +00:00
parent 031f871a2d
commit cfbcde35f5
346 changed files with 11377 additions and 8653 deletions

View File

@@ -35,8 +35,8 @@ using System.Collections.Generic;
using System.IO;
using System.Text;
using Aaru.CommonTypes;
using Aaru.CommonTypes.AaruMetadata;
using Aaru.CommonTypes.Interfaces;
using Schemas;
namespace Aaru.Core;
@@ -53,24 +53,24 @@ public sealed partial class Sidecar
/// <param name="sidecar">Metadata sidecar</param>
/// <param name="encoding">Encoding to be used for filesystem plugins</param>
static void AudioMedia(IBaseImage image, Guid filterId, string imagePath, FileInfo fi, PluginBase plugins,
List<ChecksumType> imgChecksums, ref CICMMetadataType sidecar, Encoding encoding)
List<CommonTypes.AaruMetadata.Checksum> imgChecksums, ref Metadata sidecar,
Encoding encoding)
{
sidecar.AudioMedia = new[]
sidecar.AudioMedia = new List<AudioMedia>
{
new AudioMediaType
new()
{
Checksums = imgChecksums.ToArray(),
Image = new ImageType
Checksums = imgChecksums,
Image = new Image
{
format = image.Format,
offset = 0,
offsetSpecified = true,
Value = Path.GetFileName(imagePath)
Format = image.Format,
Offset = 0,
Value = Path.GetFileName(imagePath)
},
Size = (ulong)fi.Length,
Sequence = new SequenceType
Sequence = new Sequence
{
MediaTitle = image.Info.MediaTitle
Title = image.Info.MediaTitle
}
}
};

View File

@@ -36,19 +36,23 @@ using System.IO;
using System.Linq;
using System.Text;
using Aaru.CommonTypes;
using Aaru.CommonTypes.AaruMetadata;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces;
using Aaru.CommonTypes.Metadata;
using Aaru.CommonTypes.Structs;
using Aaru.CommonTypes.Structs.Devices.ATA;
using Aaru.Console;
using Aaru.Decoders.PCMCIA;
using Aaru.DiscImages;
using Aaru.Filters;
using Aaru.Helpers;
using Schemas;
using Directory = System.IO.Directory;
using File = System.IO.File;
using MediaType = Aaru.CommonTypes.Metadata.MediaType;
using Partition = Aaru.CommonTypes.Partition;
using Pcmcia = Aaru.CommonTypes.AaruMetadata.Pcmcia;
using Tuple = Aaru.Decoders.PCMCIA.Tuple;
using Usb = Aaru.CommonTypes.AaruMetadata.Usb;
namespace Aaru.Core;
@@ -64,27 +68,26 @@ public sealed partial class Sidecar
/// <param name="sidecar">Metadata sidecar</param>
/// <param name="encoding">Encoding to be used for filesystem plugins</param>
void BlockMedia(IMediaImage image, Guid filterId, string imagePath, FileInfo fi, PluginBase plugins,
List<ChecksumType> imgChecksums, ref CICMMetadataType sidecar, Encoding encoding)
List<CommonTypes.AaruMetadata.Checksum> imgChecksums, ref Metadata sidecar, Encoding encoding)
{
if(_aborted)
return;
sidecar.BlockMedia = new[]
sidecar.BlockMedias = new List<BlockMedia>
{
new BlockMediaType
new()
{
Checksums = imgChecksums.ToArray(),
Image = new ImageType
Checksums = imgChecksums,
Image = new Image
{
format = image.Format,
offset = 0,
offsetSpecified = true,
Value = Path.GetFileName(imagePath)
Format = image.Format,
Offset = 0,
Value = Path.GetFileName(imagePath)
},
Size = (ulong)fi.Length,
Sequence = new SequenceType
Sequence = new Sequence
{
MediaTitle = image.Info.MediaTitle
Title = image.Info.MediaTitle
}
}
};
@@ -92,13 +95,13 @@ public sealed partial class Sidecar
if(image.Info.MediaSequence != 0 &&
image.Info.LastMediaSequence != 0)
{
sidecar.BlockMedia[0].Sequence.MediaSequence = (uint)image.Info.MediaSequence;
sidecar.BlockMedia[0].Sequence.TotalMedia = (uint)image.Info.LastMediaSequence;
sidecar.BlockMedias[0].Sequence.MediaSequence = (uint)image.Info.MediaSequence;
sidecar.BlockMedias[0].Sequence.TotalMedia = (uint)image.Info.LastMediaSequence;
}
else
{
sidecar.BlockMedia[0].Sequence.MediaSequence = 1;
sidecar.BlockMedia[0].Sequence.TotalMedia = 1;
sidecar.BlockMedias[0].Sequence.MediaSequence = 1;
sidecar.BlockMedias[0].Sequence.TotalMedia = 1;
}
UpdateStatus(Localization.Core.Hashing_media_tags);
@@ -118,11 +121,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].ATA = new ATAType
sidecar.BlockMedias[0].ATA = new ATA
{
Identify = new DumpType
Identify = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
}
};
@@ -134,11 +137,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].ATA = new ATAType
sidecar.BlockMedias[0].ATA = new ATA
{
Identify = new DumpType
Identify = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
}
};
@@ -150,11 +153,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].PCMCIA = new PCMCIAType
sidecar.BlockMedias[0].Pcmcia = new Pcmcia
{
CIS = new DumpType
Cis = new Dump
{
Checksums = Checksum.GetChecksums(cis).ToArray(),
Checksums = Checksum.GetChecksums(cis),
Size = (ulong)cis.Length
}
};
@@ -171,11 +174,9 @@ public sealed partial class Sidecar
if(manfid != null)
{
sidecar.BlockMedia[0].PCMCIA.ManufacturerCode = manfid.ManufacturerID;
sidecar.BlockMedias[0].Pcmcia.ManufacturerCode = manfid.ManufacturerID;
sidecar.BlockMedia[0].PCMCIA.CardCode = manfid.CardID;
sidecar.BlockMedia[0].PCMCIA.ManufacturerCodeSpecified = true;
sidecar.BlockMedia[0].PCMCIA.CardCodeSpecified = true;
sidecar.BlockMedias[0].Pcmcia.CardCode = manfid.CardID;
}
break;
@@ -184,13 +185,14 @@ public sealed partial class Sidecar
if(vers != null)
{
sidecar.BlockMedia[0].PCMCIA.Manufacturer = vers.Manufacturer;
sidecar.BlockMedia[0].PCMCIA.ProductName = vers.Product;
sidecar.BlockMedias[0].Pcmcia.Manufacturer = vers.Manufacturer;
sidecar.BlockMedias[0].Pcmcia.ProductName = vers.Product;
sidecar.BlockMedia[0].PCMCIA.Compliance =
sidecar.BlockMedias[0].Pcmcia.Compliance =
$"{vers.MajorVersion}.{vers.MinorVersion}";
sidecar.BlockMedia[0].PCMCIA.AdditionalInformation = vers.AdditionalInformation;
sidecar.BlockMedias[0].Pcmcia.AdditionalInformation =
new List<string>(vers.AdditionalInformation);
}
break;
@@ -203,11 +205,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].SCSI = new SCSIType
sidecar.BlockMedias[0].SCSI = new SCSI
{
Inquiry = new DumpType
Inquiry = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
}
};
@@ -219,11 +221,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].SecureDigital ??= new SecureDigitalType();
sidecar.BlockMedias[0].SecureDigital ??= new SecureDigital();
sidecar.BlockMedia[0].SecureDigital.CID = new DumpType
sidecar.BlockMedias[0].SecureDigital.CID = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
};
@@ -234,11 +236,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].SecureDigital ??= new SecureDigitalType();
sidecar.BlockMedias[0].SecureDigital ??= new SecureDigital();
sidecar.BlockMedia[0].SecureDigital.CSD = new DumpType
sidecar.BlockMedias[0].SecureDigital.CSD = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
};
@@ -249,11 +251,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].SecureDigital ??= new SecureDigitalType();
sidecar.BlockMedias[0].SecureDigital ??= new SecureDigital();
sidecar.BlockMedia[0].SecureDigital.SCR = new DumpType
sidecar.BlockMedias[0].SecureDigital.SCR = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
};
@@ -264,11 +266,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].SecureDigital ??= new SecureDigitalType();
sidecar.BlockMedias[0].SecureDigital ??= new SecureDigital();
sidecar.BlockMedia[0].SecureDigital.OCR = new DumpType
sidecar.BlockMedias[0].SecureDigital.OCR = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
};
@@ -279,11 +281,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].MultiMediaCard ??= new MultiMediaCardType();
sidecar.BlockMedias[0].MultiMediaCard ??= new MultiMediaCard();
sidecar.BlockMedia[0].MultiMediaCard.CID = new DumpType
sidecar.BlockMedias[0].MultiMediaCard.CID = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
};
@@ -294,11 +296,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].MultiMediaCard ??= new MultiMediaCardType();
sidecar.BlockMedias[0].MultiMediaCard ??= new MultiMediaCard();
sidecar.BlockMedia[0].MultiMediaCard.CSD = new DumpType
sidecar.BlockMedias[0].MultiMediaCard.CSD = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
};
@@ -309,11 +311,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].MultiMediaCard ??= new MultiMediaCardType();
sidecar.BlockMedias[0].MultiMediaCard ??= new MultiMediaCard();
sidecar.BlockMedia[0].MultiMediaCard.OCR = new DumpType
sidecar.BlockMedias[0].MultiMediaCard.OCR = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
};
@@ -324,11 +326,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].MultiMediaCard ??= new MultiMediaCardType();
sidecar.BlockMedias[0].MultiMediaCard ??= new MultiMediaCard();
sidecar.BlockMedia[0].MultiMediaCard.ExtendedCSD = new DumpType
sidecar.BlockMedias[0].MultiMediaCard.ExtendedCSD = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
};
@@ -339,11 +341,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].USB ??= new USBType();
sidecar.BlockMedias[0].Usb ??= new Usb();
sidecar.BlockMedia[0].USB.Descriptors = new DumpType
sidecar.BlockMedias[0].Usb.Descriptors = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
};
@@ -354,11 +356,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].SCSI ??= new SCSIType();
sidecar.BlockMedias[0].SCSI ??= new SCSI();
sidecar.BlockMedia[0].SCSI.ModeSense = new DumpType
sidecar.BlockMedias[0].SCSI.ModeSense = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
};
@@ -369,11 +371,11 @@ public sealed partial class Sidecar
if(errno != ErrorNumber.NoError)
break;
sidecar.BlockMedia[0].SCSI ??= new SCSIType();
sidecar.BlockMedias[0].SCSI ??= new SCSI();
sidecar.BlockMedia[0].SCSI.ModeSense10 = new DumpType
sidecar.BlockMedias[0].SCSI.ModeSense10 = new Dump
{
Checksums = Checksum.GetChecksums(buffer).ToArray(),
Checksums = Checksum.GetChecksums(buffer),
Size = (ulong)buffer.Length
};
@@ -384,7 +386,7 @@ public sealed partial class Sidecar
// If there is only one track, and it's the same as the image file (e.g. ".iso" files), don't re-checksum.
if(image.Id == new Guid("12345678-AAAA-BBBB-CCCC-123456789000") &&
filterId == new Guid("12345678-AAAA-BBBB-CCCC-123456789000"))
sidecar.BlockMedia[0].ContentChecksums = sidecar.BlockMedia[0].Checksums;
sidecar.BlockMedias[0].ContentChecksums = sidecar.BlockMedias[0].Checksums;
else
{
UpdateStatus(Localization.Core.Hashing_sectors);
@@ -448,42 +450,40 @@ public sealed partial class Sidecar
// For fast debugging, skip checksum
//skipImageChecksum:
List<ChecksumType> cntChecksums = contentChkWorker.End();
sidecar.BlockMedia[0].ContentChecksums = cntChecksums.ToArray();
sidecar.BlockMedias[0].ContentChecksums = contentChkWorker.End();
EndProgress2();
}
(string type, string subType) diskType = MediaType.MediaTypeToString(image.Info.MediaType);
sidecar.BlockMedia[0].DiskType = diskType.type;
sidecar.BlockMedia[0].DiskSubType = diskType.subType;
sidecar.BlockMedias[0].MediaType = diskType.type;
sidecar.BlockMedias[0].MediaSubType = diskType.subType;
Statistics.AddMedia(image.Info.MediaType, false);
sidecar.BlockMedia[0].Dimensions = Dimensions.DimensionsFromMediaType(image.Info.MediaType);
sidecar.BlockMedias[0].Dimensions = Dimensions.DimensionsFromMediaType(image.Info.MediaType);
sidecar.BlockMedia[0].LogicalBlocks = image.Info.Sectors;
sidecar.BlockMedia[0].LogicalBlockSize = image.Info.SectorSize;
sidecar.BlockMedias[0].LogicalBlocks = image.Info.Sectors;
sidecar.BlockMedias[0].LogicalBlockSize = image.Info.SectorSize;
// TODO: Detect it
sidecar.BlockMedia[0].PhysicalBlockSize = image.Info.SectorSize;
sidecar.BlockMedias[0].PhysicalBlockSize = image.Info.SectorSize;
if(image is ITapeImage { IsTape: true } tapeImage)
{
List<TapePartitionType> tapePartitions = new();
List<TapePartition> tapePartitions = new();
foreach(TapePartition tapePartition in tapeImage.TapePartitions)
foreach(CommonTypes.Structs.TapePartition tapePartition in tapeImage.TapePartitions)
{
var thisPartition = new TapePartitionType
var thisPartition = new TapePartition
{
Image = sidecar.BlockMedia[0].Image,
Image = sidecar.BlockMedias[0].Image,
Sequence = tapePartition.Number,
StartBlock = tapePartition.FirstBlock,
EndBlock = tapePartition.LastBlock
};
if(tapeImage.TapePartitions.Count == 1)
thisPartition.Checksums = sidecar.BlockMedia[0].ContentChecksums;
thisPartition.Checksums = sidecar.BlockMedias[0].ContentChecksums;
else
{
UpdateStatus(string.Format(Localization.Core.Hashing_partition_0, tapePartition.Number));
@@ -560,23 +560,22 @@ public sealed partial class Sidecar
// For fast debugging, skip checksum
//skipImageChecksum:
List<ChecksumType> partitionChecksums = tapePartitionChk.End();
thisPartition.Checksums = partitionChecksums.ToArray();
thisPartition.Checksums = tapePartitionChk.End();
EndProgress2();
}
List<TapeFileType> filesInPartition = new();
List<TapeFile> filesInPartition = new();
foreach(TapeFile tapeFile in tapeImage.Files.Where(f => f.Partition == tapePartition.Number))
foreach(CommonTypes.Structs.TapeFile tapeFile in
tapeImage.Files.Where(f => f.Partition == tapePartition.Number))
{
var thisFile = new TapeFileType
var thisFile = new TapeFile
{
Sequence = tapeFile.File,
StartBlock = tapeFile.FirstBlock,
EndBlock = tapeFile.LastBlock,
Image = sidecar.BlockMedia[0].Image,
Image = sidecar.BlockMedias[0].Image,
Size = 0,
BlockSize = 0
};
@@ -666,9 +665,7 @@ public sealed partial class Sidecar
// For fast debugging, skip checksum
//skipImageChecksum:
List<ChecksumType> fileChecksums = tapeFileChk.End();
thisFile.Checksums = fileChecksums.ToArray();
thisFile.Checksums = tapeFileChk.End();
EndProgress2();
}
@@ -676,11 +673,11 @@ public sealed partial class Sidecar
filesInPartition.Add(thisFile);
}
thisPartition.File = filesInPartition.ToArray();
thisPartition.File = filesInPartition;
tapePartitions.Add(thisPartition);
}
sidecar.BlockMedia[0].TapeInformation = tapePartitions.ToArray();
sidecar.BlockMedias[0].TapeInformation = tapePartitions;
}
UpdateStatus(Localization.Core.Checking_filesystems);
@@ -691,28 +688,26 @@ public sealed partial class Sidecar
List<Partition> partitions = Partitions.GetAll(image);
Partitions.AddSchemesToStats(partitions);
sidecar.BlockMedia[0].FileSystemInformation = new PartitionType[1];
sidecar.BlockMedias[0].FileSystemInformation = new List<CommonTypes.AaruMetadata.Partition>();
if(partitions.Count > 0)
{
sidecar.BlockMedia[0].FileSystemInformation = new PartitionType[partitions.Count];
for(int i = 0; i < partitions.Count; i++)
foreach(Partition partition in partitions)
{
if(_aborted)
return;
sidecar.BlockMedia[0].FileSystemInformation[i] = new PartitionType
var fsInfo = new CommonTypes.AaruMetadata.Partition
{
Description = partitions[i].Description,
EndSector = partitions[i].End,
Name = partitions[i].Name,
Sequence = (uint)partitions[i].Sequence,
StartSector = partitions[i].Start,
Type = partitions[i].Type
Description = partition.Description,
EndSector = partition.End,
Name = partition.Name,
Sequence = (uint)partition.Sequence,
StartSector = partition.Start,
Type = partition.Type
};
List<FileSystemType> lstFs = new();
List<FileSystem> lstFs = new();
foreach(IFilesystem plugin in plugins.PluginsList.Values)
try
@@ -720,23 +715,23 @@ public sealed partial class Sidecar
if(_aborted)
return;
if(!plugin.Identify(image, partitions[i]))
if(!plugin.Identify(image, partition))
continue;
if(plugin is IReadOnlyFilesystem fsPlugin &&
fsPlugin.Mount(image, partitions[i], encoding, null, null) == ErrorNumber.NoError)
fsPlugin.Mount(image, partition, encoding, null, null) == ErrorNumber.NoError)
{
UpdateStatus(string.Format(Localization.Core.Mounting_0, fsPlugin.XmlFsType.Type));
UpdateStatus(string.Format(Localization.Core.Mounting_0, fsPlugin.Metadata.Type));
fsPlugin.XmlFsType.Contents = Files(fsPlugin);
fsPlugin.Metadata.Contents = Files(fsPlugin);
fsPlugin.Unmount();
}
else
plugin.GetInformation(image, partitions[i], out _, encoding);
plugin.GetInformation(image, partition, out _, encoding);
lstFs.Add(plugin.XmlFsType);
Statistics.AddFilesystem(plugin.XmlFsType.Type);
lstFs.Add(plugin.Metadata);
Statistics.AddFilesystem(plugin.Metadata.Type);
}
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
catch
@@ -746,7 +741,9 @@ public sealed partial class Sidecar
}
if(lstFs.Count > 0)
sidecar.BlockMedia[0].FileSystemInformation[i].FileSystems = lstFs.ToArray();
fsInfo.FileSystems = lstFs;
sidecar.BlockMedias[0].FileSystemInformation.Add(fsInfo);
}
}
else
@@ -754,7 +751,7 @@ public sealed partial class Sidecar
if(_aborted)
return;
sidecar.BlockMedia[0].FileSystemInformation[0] = new PartitionType
var fsInfo = new CommonTypes.AaruMetadata.Partition
{
StartSector = 0,
EndSector = image.Info.Sectors - 1
@@ -767,7 +764,7 @@ public sealed partial class Sidecar
Size = image.Info.Sectors * image.Info.SectorSize
};
List<FileSystemType> lstFs = new();
List<FileSystem> lstFs = new();
foreach(IFilesystem plugin in plugins.PluginsList.Values)
try
@@ -781,17 +778,17 @@ public sealed partial class Sidecar
if(plugin is IReadOnlyFilesystem fsPlugin &&
fsPlugin.Mount(image, wholePart, encoding, null, null) == ErrorNumber.NoError)
{
UpdateStatus(string.Format(Localization.Core.Mounting_0, fsPlugin.XmlFsType.Type));
UpdateStatus(string.Format(Localization.Core.Mounting_0, fsPlugin.Metadata.Type));
fsPlugin.XmlFsType.Contents = Files(fsPlugin);
fsPlugin.Metadata.Contents = Files(fsPlugin);
fsPlugin.Unmount();
}
else
plugin.GetInformation(image, wholePart, out _, encoding);
lstFs.Add(plugin.XmlFsType);
Statistics.AddFilesystem(plugin.XmlFsType.Type);
lstFs.Add(plugin.Metadata);
Statistics.AddFilesystem(plugin.Metadata.Type);
}
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
catch
@@ -801,7 +798,9 @@ public sealed partial class Sidecar
}
if(lstFs.Count > 0)
sidecar.BlockMedia[0].FileSystemInformation[0].FileSystems = lstFs.ToArray();
fsInfo.FileSystems = lstFs;
sidecar.BlockMedias[0].FileSystemInformation.Add(fsInfo);
}
UpdateStatus(Localization.Core.Saving_metadata);
@@ -809,12 +808,9 @@ public sealed partial class Sidecar
if(image.Info.Cylinders > 0 &&
image.Info is { Heads: > 0, SectorsPerTrack: > 0 })
{
sidecar.BlockMedia[0].CylindersSpecified = true;
sidecar.BlockMedia[0].HeadsSpecified = true;
sidecar.BlockMedia[0].SectorsPerTrackSpecified = true;
sidecar.BlockMedia[0].Cylinders = image.Info.Cylinders;
sidecar.BlockMedia[0].Heads = (ushort)image.Info.Heads;
sidecar.BlockMedia[0].SectorsPerTrack = image.Info.SectorsPerTrack;
sidecar.BlockMedias[0].Cylinders = image.Info.Cylinders;
sidecar.BlockMedias[0].Heads = (ushort)image.Info.Heads;
sidecar.BlockMedias[0].SectorsPerTrack = image.Info.SectorsPerTrack;
}
if(image.Info.ReadableMediaTags.Contains(MediaTagType.ATA_IDENTIFY))
@@ -830,28 +826,21 @@ public sealed partial class Sidecar
ataId.Value.CurrentHeads > 0 &&
ataId.Value.CurrentSectorsPerTrack > 0)
{
sidecar.BlockMedia[0].CylindersSpecified = true;
sidecar.BlockMedia[0].HeadsSpecified = true;
sidecar.BlockMedia[0].SectorsPerTrackSpecified = true;
sidecar.BlockMedia[0].Cylinders = ataId.Value.CurrentCylinders;
sidecar.BlockMedia[0].Heads = ataId.Value.CurrentHeads;
sidecar.BlockMedia[0].SectorsPerTrack = ataId.Value.CurrentSectorsPerTrack;
sidecar.BlockMedias[0].Cylinders = ataId.Value.CurrentCylinders;
sidecar.BlockMedias[0].Heads = ataId.Value.CurrentHeads;
sidecar.BlockMedias[0].SectorsPerTrack = ataId.Value.CurrentSectorsPerTrack;
}
else if(ataId.Value.Cylinders > 0 &&
ataId.Value.Heads > 0 &&
ataId.Value.SectorsPerTrack > 0)
{
sidecar.BlockMedia[0].CylindersSpecified = true;
sidecar.BlockMedia[0].HeadsSpecified = true;
sidecar.BlockMedia[0].SectorsPerTrackSpecified = true;
sidecar.BlockMedia[0].Cylinders = ataId.Value.Cylinders;
sidecar.BlockMedia[0].Heads = ataId.Value.Heads;
sidecar.BlockMedia[0].SectorsPerTrack = ataId.Value.SectorsPerTrack;
sidecar.BlockMedias[0].Cylinders = ataId.Value.Cylinders;
sidecar.BlockMedias[0].Heads = ataId.Value.Heads;
sidecar.BlockMedias[0].SectorsPerTrack = ataId.Value.SectorsPerTrack;
}
}
if(image.DumpHardware != null)
sidecar.BlockMedia[0].DumpHardwareArray = image.DumpHardware.ToArray();
sidecar.BlockMedias[0].DumpHardware = image.DumpHardware;
// TODO: This is more of a hack, redo it planned for >4.0
string trkFormat = null;
@@ -1009,24 +998,24 @@ public sealed partial class Sidecar
(image.Info.Heads == 1 && scpImage.Header.heads is 1 or 2))
if(scpImage.Header.end + 1 >= image.Info.Cylinders)
{
List<BlockTrackType> scpBlockTrackTypes = new();
ulong currentSector = 0;
Stream scpStream = scpFilter.GetDataForkStream();
List<BlockTrack> scpBlockTrackTypes = new();
ulong currentSector = 0;
Stream scpStream = scpFilter.GetDataForkStream();
for(byte t = scpImage.Header.start; t <= scpImage.Header.end; t++)
{
if(_aborted)
return;
var scpBlockTrackType = new BlockTrackType
var scpBlockTrackType = new BlockTrack
{
Cylinder = t / image.Info.Heads,
Head = (ushort)(t % image.Info.Heads),
Image = new ImageType
Image = new Image
{
format = scpImage.Format,
Format = scpImage.Format,
Value = Path.GetFileName(scpFilePath),
offset = scpImage.Header.offsets[t]
Offset = scpImage.Header.offsets[t]
}
};
@@ -1049,14 +1038,14 @@ public sealed partial class Sidecar
scpStream.Position = scpImage.Header.offsets[t];
scpStream.EnsureRead(trackContents, 0, trackContents.Length);
scpBlockTrackType.Size = (ulong)trackContents.Length;
scpBlockTrackType.Checksums = Checksum.GetChecksums(trackContents).ToArray();
scpBlockTrackType.Checksums = Checksum.GetChecksums(trackContents);
}
scpBlockTrackTypes.Add(scpBlockTrackType);
}
sidecar.BlockMedia[0].Track = scpBlockTrackTypes.OrderBy(t => t.Cylinder).
ThenBy(t => t.Head).ToArray();
sidecar.BlockMedias[0].Track = scpBlockTrackTypes.OrderBy(t => t.Cylinder).
ThenBy(t => t.Head).ToList();
}
else
AaruConsole.
@@ -1115,7 +1104,7 @@ public sealed partial class Sidecar
if(kfImage.Info.Heads == image.Info.Heads)
if(kfImage.Info.Cylinders >= image.Info.Cylinders)
{
List<BlockTrackType> kfBlockTrackTypes = new();
List<BlockTrack> kfBlockTrackTypes = new();
ulong currentSector = 0;
@@ -1124,18 +1113,18 @@ public sealed partial class Sidecar
if(_aborted)
return;
var kfBlockTrackType = new BlockTrackType
var kfBlockTrackType = new BlockTrack
{
Cylinder = kvp.Key / image.Info.Heads,
Head = (ushort)(kvp.Key % image.Info.Heads),
Image = new ImageType
Image = new Image
{
format = kfImage.Format,
Format = kfImage.Format,
Value = kfDir
? Path.
Combine(Path.GetFileName(Path.GetDirectoryName(kvp.Value.BasePath)),
kvp.Value.Filename) : kvp.Value.Filename,
offset = 0
Offset = 0
}
};
@@ -1154,13 +1143,13 @@ public sealed partial class Sidecar
kfStream.Position = 0;
kfStream.EnsureRead(trackContents, 0, trackContents.Length);
kfBlockTrackType.Size = (ulong)trackContents.Length;
kfBlockTrackType.Checksums = Checksum.GetChecksums(trackContents).ToArray();
kfBlockTrackType.Checksums = Checksum.GetChecksums(trackContents);
kfBlockTrackTypes.Add(kfBlockTrackType);
}
sidecar.BlockMedia[0].Track = kfBlockTrackTypes.OrderBy(t => t.Cylinder).
ThenBy(t => t.Head).ToArray();
sidecar.BlockMedias[0].Track = kfBlockTrackTypes.OrderBy(t => t.Cylinder).
ThenBy(t => t.Head).ToList();
}
else
AaruConsole.
@@ -1202,22 +1191,22 @@ public sealed partial class Sidecar
if(image.Info.Heads == dfiImage.Info.Heads)
if(dfiImage.Info.Cylinders >= image.Info.Cylinders)
{
List<BlockTrackType> dfiBlockTrackTypes = new();
ulong currentSector = 0;
Stream dfiStream = dfiFilter.GetDataForkStream();
List<BlockTrack> dfiBlockTrackTypes = new();
ulong currentSector = 0;
Stream dfiStream = dfiFilter.GetDataForkStream();
foreach(int t in dfiImage.TrackOffsets.Keys)
{
if(_aborted)
return;
var dfiBlockTrackType = new BlockTrackType
var dfiBlockTrackType = new BlockTrack
{
Cylinder = (uint)(t / image.Info.Heads),
Head = (ushort)(t % image.Info.Heads),
Image = new ImageType
Image = new Image
{
format = dfiImage.Format,
Format = dfiImage.Format,
Value = Path.GetFileName(dfiFilePath)
}
};
@@ -1235,18 +1224,18 @@ public sealed partial class Sidecar
if(dfiImage.TrackOffsets.TryGetValue(t, out long offset) &&
dfiImage.TrackLengths.TryGetValue(t, out long length))
{
dfiBlockTrackType.Image.offset = (ulong)offset;
dfiBlockTrackType.Image.Offset = (ulong)offset;
byte[] trackContents = new byte[length];
dfiStream.Position = offset;
dfiStream.EnsureRead(trackContents, 0, trackContents.Length);
dfiBlockTrackType.Size = (ulong)trackContents.Length;
dfiBlockTrackType.Checksums = Checksum.GetChecksums(trackContents).ToArray();
dfiBlockTrackType.Checksums = Checksum.GetChecksums(trackContents);
}
dfiBlockTrackTypes.Add(dfiBlockTrackType);
}
sidecar.BlockMedia[0].Track = dfiBlockTrackTypes.OrderBy(t => t.Cylinder).ThenBy(t => t.Head).ToArray();
sidecar.BlockMedias[0].Track = dfiBlockTrackTypes.OrderBy(t => t.Cylinder).ThenBy(t => t.Head).ToList();
}
else
AaruConsole.

View File

@@ -32,8 +32,8 @@
using System.Collections.Generic;
using System.IO;
using Aaru.CommonTypes.AaruMetadata;
using Aaru.Helpers;
using Schemas;
namespace Aaru.Core;
@@ -44,37 +44,35 @@ public sealed partial class Sidecar
/// <param name="files">List of files</param>
/// <param name="folderName">Dump path</param>
/// <param name="blockSize">Expected block size in bytes</param>
public CICMMetadataType BlockTape(string folderName, List<string> files, uint blockSize)
public Metadata BlockTape(string folderName, List<string> files, uint blockSize)
{
_sidecar = new CICMMetadataType
_sidecar = new Metadata
{
BlockMedia = new[]
BlockMedias = new List<BlockMedia>
{
new BlockMediaType
new()
{
Image = new ImageType
Image = new Image
{
format = "Directory",
offsetSpecified = false,
Value = folderName
Format = "Directory",
Value = folderName
},
Sequence = new SequenceType
Sequence = new Sequence
{
MediaTitle = folderName,
Title = folderName,
MediaSequence = 1,
TotalMedia = 1
},
PhysicalBlockSize = blockSize,
LogicalBlockSize = blockSize,
TapeInformation = new[]
TapeInformation = new List<TapePartition>
{
new TapePartitionType
new()
{
Image = new ImageType
Image = new Image
{
format = "Directory",
offsetSpecified = false,
Value = folderName
Format = "Directory",
Value = folderName
}
}
}
@@ -85,10 +83,10 @@ public sealed partial class Sidecar
if(_aborted)
return _sidecar;
ulong currentBlock = 0;
ulong totalSize = 0;
var tapeWorker = new Checksum();
List<TapeFileType> tapeFiles = new();
ulong currentBlock = 0;
ulong totalSize = 0;
var tapeWorker = new Checksum();
List<TapeFile> tapeFiles = new();
UpdateStatus(Localization.Core.Hashing_files);
@@ -100,12 +98,12 @@ public sealed partial class Sidecar
_fs = new FileStream(files[i], FileMode.Open, FileAccess.Read);
var fileWorker = new Checksum();
var tapeFile = new TapeFileType
var tapeFile = new TapeFile
{
Image = new ImageType
Image = new Image
{
format = "Raw disk image (sector by sector copy)",
offset = 0,
Format = "Raw disk image (sector by sector copy)",
Offset = 0,
Value = Path.GetFileName(files[i])
},
Size = (ulong)_fs.Length,
@@ -159,92 +157,92 @@ public sealed partial class Sidecar
tapeFile.EndBlock = tapeFile.StartBlock + sectors - 1;
currentBlock += sectors;
totalSize += (ulong)_fs.Length;
tapeFile.Checksums = fileWorker.End().ToArray();
tapeFile.Checksums = fileWorker.End();
tapeFiles.Add(tapeFile);
EndProgress2();
}
UpdateStatus("Setting metadata...");
_sidecar.BlockMedia[0].Checksums = tapeWorker.End().ToArray();
_sidecar.BlockMedia[0].ContentChecksums = _sidecar.BlockMedia[0].Checksums;
_sidecar.BlockMedia[0].Size = totalSize;
_sidecar.BlockMedia[0].LogicalBlocks = currentBlock;
_sidecar.BlockMedia[0].TapeInformation[0].EndBlock = currentBlock - 1;
_sidecar.BlockMedia[0].TapeInformation[0].Size = totalSize;
_sidecar.BlockMedia[0].TapeInformation[0].Checksums = _sidecar.BlockMedia[0].Checksums;
_sidecar.BlockMedia[0].TapeInformation[0].File = tapeFiles.ToArray();
_sidecar.BlockMedias[0].Checksums = tapeWorker.End();
_sidecar.BlockMedias[0].ContentChecksums = _sidecar.BlockMedias[0].Checksums;
_sidecar.BlockMedias[0].Size = totalSize;
_sidecar.BlockMedias[0].LogicalBlocks = currentBlock;
_sidecar.BlockMedias[0].TapeInformation[0].EndBlock = currentBlock - 1;
_sidecar.BlockMedias[0].TapeInformation[0].Size = totalSize;
_sidecar.BlockMedias[0].TapeInformation[0].Checksums = _sidecar.BlockMedias[0].Checksums;
_sidecar.BlockMedias[0].TapeInformation[0].File = tapeFiles;
// This is purely for convenience, as typically these kind of data represents QIC tapes
if(blockSize == 512)
{
_sidecar.BlockMedia[0].DiskType = "Quarter-inch cartridge";
_sidecar.BlockMedias[0].MediaType = "Quarter-inch cartridge";
switch(totalSize)
{
case <= 20 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-11";
_sidecar.BlockMedias[0].MediaSubType = "QIC-11";
break;
case <= 40 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-40";
_sidecar.BlockMedias[0].MediaSubType = "QIC-40";
break;
case <= 60 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-24";
_sidecar.BlockMedias[0].MediaSubType = "QIC-24";
break;
case <= 80 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-80";
_sidecar.BlockMedias[0].MediaSubType = "QIC-80";
break;
case <= 120 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-120";
_sidecar.BlockMedias[0].MediaSubType = "QIC-120";
break;
case <= 150 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-150";
_sidecar.BlockMedias[0].MediaSubType = "QIC-150";
break;
case <= 320 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-320";
_sidecar.BlockMedias[0].MediaSubType = "QIC-320";
break;
case <= 340 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-3010";
_sidecar.BlockMedias[0].MediaSubType = "QIC-3010";
break;
case <= 525 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-525";
_sidecar.BlockMedias[0].MediaSubType = "QIC-525";
break;
case <= 670 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-3020";
_sidecar.BlockMedias[0].MediaSubType = "QIC-3020";
break;
case <= 1200 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-3080";
_sidecar.BlockMedias[0].MediaSubType = "QIC-3080";
break;
case <= 1350 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-1350";
_sidecar.BlockMedias[0].MediaSubType = "QIC-1350";
break;
case <= (long)4000 * 1048576:
_sidecar.BlockMedia[0].DiskSubType = "QIC-3095";
_sidecar.BlockMedias[0].MediaSubType = "QIC-3095";
break;
default:
_sidecar.BlockMedia[0].DiskType = "Unknown tape";
_sidecar.BlockMedia[0].DiskSubType = "Unknown tape";
_sidecar.BlockMedias[0].MediaType = "Unknown tape";
_sidecar.BlockMedias[0].MediaSubType = "Unknown tape";
break;
}
}
else
{
_sidecar.BlockMedia[0].DiskType = "Unknown tape";
_sidecar.BlockMedia[0].DiskSubType = "Unknown tape";
_sidecar.BlockMedias[0].MediaType = "Unknown tape";
_sidecar.BlockMedias[0].MediaSubType = "Unknown tape";
}
return _sidecar;

View File

@@ -34,27 +34,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Aaru.CommonTypes.AaruMetadata;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces;
using Aaru.CommonTypes.Structs;
using Aaru.Console;
using Schemas;
namespace Aaru.Core;
public sealed partial class Sidecar
{
FilesystemContentsType Files(IReadOnlyFilesystem filesystem)
FilesystemContents Files(IReadOnlyFilesystem filesystem)
{
var contents = new FilesystemContentsType();
var contents = new FilesystemContents();
ErrorNumber ret = filesystem.ReadDir("/", out List<string> dirents);
if(ret != ErrorNumber.NoError)
return null;
List<DirectoryType> directories = new();
List<ContentsFileType> files = new();
List<Directory> directories = new();
List<ContentsFile> files = new();
foreach(string dirent in dirents)
{
@@ -78,86 +78,40 @@ public sealed partial class Sidecar
}
if(files.Count > 0)
contents.File = files.OrderBy(f => f.name).ToArray();
contents.Files = files.OrderBy(f => f.Name).ToList();
if(directories.Count > 0)
contents.Directory = directories.OrderBy(d => d.name).ToArray();
contents.Directories = directories.OrderBy(d => d.Name).ToList();
return contents;
}
DirectoryType SidecarDirectory(IReadOnlyFilesystem filesystem, string path, string filename, FileEntryInfo stat)
Directory SidecarDirectory(IReadOnlyFilesystem filesystem, string path, string filename, FileEntryInfo stat)
{
var directory = new DirectoryType();
if(stat.AccessTimeUtc.HasValue)
var directory = new Directory
{
directory.accessTime = stat.AccessTimeUtc.Value;
directory.accessTimeSpecified = true;
}
directory.attributes = (ulong)stat.Attributes;
if(stat.BackupTimeUtc.HasValue)
{
directory.backupTime = stat.BackupTimeUtc.Value;
directory.backupTimeSpecified = true;
}
if(stat.CreationTimeUtc.HasValue)
{
directory.creationTime = stat.CreationTimeUtc.Value;
directory.creationTimeSpecified = true;
}
if(stat.DeviceNo.HasValue)
{
directory.deviceNumber = stat.DeviceNo.Value;
directory.deviceNumberSpecified = true;
}
directory.inode = stat.Inode;
if(stat.LastWriteTimeUtc.HasValue)
{
directory.lastWriteTime = stat.LastWriteTimeUtc.Value;
directory.lastWriteTimeSpecified = true;
}
directory.links = stat.Links;
directory.name = filename;
if(stat.GID.HasValue)
{
directory.posixGroupId = stat.GID.Value;
directory.posixGroupIdSpecified = true;
}
if(stat.Mode.HasValue)
{
directory.posixMode = stat.Mode.Value;
directory.posixModeSpecified = true;
}
if(stat.UID.HasValue)
{
directory.posixUserId = stat.UID.Value;
directory.posixUserIdSpecified = true;
}
if(stat.StatusChangeTimeUtc.HasValue)
{
directory.statusChangeTime = stat.StatusChangeTimeUtc.Value;
directory.statusChangeTimeSpecified = true;
}
AccessTime = stat.AccessTimeUtc,
Attributes = (ulong)stat.Attributes,
BackupTime = stat.BackupTimeUtc,
CreationTime = stat.CreationTimeUtc,
DeviceNumber = stat.DeviceNo,
Inode = stat.Inode,
LastWriteTime = stat.LastWriteTimeUtc,
Links = stat.Links,
Name = filename,
PosixGroupId = stat.GID,
PosixMode = stat.Mode,
PosixUserId = stat.UID,
StatusChangeTime = stat.StatusChangeTimeUtc
};
ErrorNumber ret = filesystem.ReadDir(path + "/" + filename, out List<string> dirents);
if(ret != ErrorNumber.NoError)
return null;
List<DirectoryType> directories = new();
List<ContentsFileType> files = new();
List<Directory> directories = new();
List<ContentsFile> files = new();
foreach(string dirent in dirents)
{
@@ -181,80 +135,35 @@ public sealed partial class Sidecar
}
if(files.Count > 0)
directory.File = files.OrderBy(f => f.name).ToArray();
directory.Files = files.OrderBy(f => f.Name).ToList();
if(directories.Count > 0)
directory.Directory = directories.OrderBy(d => d.name).ToArray();
directory.Directories = directories.OrderBy(d => d.Name).ToList();
return directory;
}
ContentsFileType SidecarFile(IReadOnlyFilesystem filesystem, string path, string filename, FileEntryInfo stat)
ContentsFile SidecarFile(IReadOnlyFilesystem filesystem, string path, string filename, FileEntryInfo stat)
{
var file = new ContentsFileType();
var fileChkWorker = new Checksum();
if(stat.AccessTimeUtc.HasValue)
var file = new ContentsFile
{
file.accessTime = stat.AccessTimeUtc.Value;
file.accessTimeSpecified = true;
}
file.attributes = (ulong)stat.Attributes;
if(stat.BackupTimeUtc.HasValue)
{
file.backupTime = stat.BackupTimeUtc.Value;
file.backupTimeSpecified = true;
}
if(stat.CreationTimeUtc.HasValue)
{
file.creationTime = stat.CreationTimeUtc.Value;
file.creationTimeSpecified = true;
}
if(stat.DeviceNo.HasValue)
{
file.deviceNumber = stat.DeviceNo.Value;
file.deviceNumberSpecified = true;
}
file.inode = stat.Inode;
if(stat.LastWriteTimeUtc.HasValue)
{
file.lastWriteTime = stat.LastWriteTimeUtc.Value;
file.lastWriteTimeSpecified = true;
}
file.length = (ulong)stat.Length;
file.links = stat.Links;
file.name = filename;
if(stat.GID.HasValue)
{
file.posixGroupId = stat.GID.Value;
file.posixGroupIdSpecified = true;
}
if(stat.Mode.HasValue)
{
file.posixMode = stat.Mode.Value;
file.posixModeSpecified = true;
}
if(stat.UID.HasValue)
{
file.posixUserId = stat.UID.Value;
file.posixUserIdSpecified = true;
}
if(stat.StatusChangeTimeUtc.HasValue)
{
file.statusChangeTime = stat.StatusChangeTimeUtc.Value;
file.statusChangeTimeSpecified = true;
}
AccessTime = stat.AccessTimeUtc,
Attributes = (ulong)stat.Attributes,
BackupTime = stat.BackupTimeUtc,
CreationTime = stat.CreationTimeUtc,
DeviceNumber = stat.DeviceNo,
Inode = stat.Inode,
LastWriteTime = stat.LastWriteTimeUtc,
Length = (ulong)stat.Length,
Links = stat.Links,
Name = filename,
PosixGroupId = stat.GID,
PosixMode = stat.Mode,
PosixUserId = stat.UID,
StatusChangeTime = stat.StatusChangeTimeUtc
};
byte[] data = Array.Empty<byte>();
@@ -288,7 +197,7 @@ public sealed partial class Sidecar
EndProgress2();
file.Checksums = fileChkWorker.End().ToArray();
file.Checksums = fileChkWorker.End();
}
else
file.Checksums = _emptyChecksums;
@@ -298,7 +207,7 @@ public sealed partial class Sidecar
if(ret != ErrorNumber.NoError)
return file;
List<ExtendedAttributeType> xattrTypes = new();
List<ExtendedAttribute> xattrTypes = new();
foreach(string xattr in xattrs)
{
@@ -310,16 +219,16 @@ public sealed partial class Sidecar
var xattrChkWorker = new Checksum();
xattrChkWorker.Update(data);
xattrTypes.Add(new ExtendedAttributeType
xattrTypes.Add(new ExtendedAttribute
{
Checksums = xattrChkWorker.End().ToArray(),
length = (ulong)data.Length,
name = xattr
Checksums = xattrChkWorker.End(),
Length = (ulong)data.Length,
Name = xattr
});
}
if(xattrTypes.Count > 0)
file.ExtendedAttributes = xattrTypes.OrderBy(x => x.name).ToArray();
file.ExtendedAttributes = xattrTypes.OrderBy(x => x.Name).ToList();
return file;
}

View File

@@ -35,8 +35,8 @@ using System.Collections.Generic;
using System.IO;
using System.Text;
using Aaru.CommonTypes;
using Aaru.CommonTypes.AaruMetadata;
using Aaru.CommonTypes.Interfaces;
using Schemas;
namespace Aaru.Core;
@@ -53,18 +53,17 @@ public sealed partial class Sidecar
/// <param name="sidecar">Metadata sidecar</param>
/// <param name="encoding">Encoding to be used for filesystem plugins</param>
static void LinearMedia(IByteAddressableImage image, Guid filterId, string imagePath, FileInfo fi,
PluginBase plugins, List<ChecksumType> imgChecksums, ref CICMMetadataType sidecar,
Encoding encoding) => sidecar.LinearMedia = new[]
PluginBase plugins, List<CommonTypes.AaruMetadata.Checksum> imgChecksums,
ref Metadata sidecar, Encoding encoding) => sidecar.LinearMedias = new List<LinearMedia>
{
new LinearMediaType
new()
{
Checksums = imgChecksums.ToArray(),
Image = new ImageType
Checksums = imgChecksums,
Image = new Image
{
format = image.Format,
offset = 0,
offsetSpecified = true,
Value = Path.GetFileName(imagePath)
Format = image.Format,
Offset = 0,
Value = Path.GetFileName(imagePath)
},
Size = image.Info.Sectors
}

View File

@@ -36,18 +36,19 @@ using System.IO;
using System.Linq;
using System.Text;
using Aaru.CommonTypes;
using Aaru.CommonTypes.AaruMetadata;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces;
using Aaru.CommonTypes.Metadata;
using Aaru.CommonTypes.Structs;
using Aaru.Core.Devices.Dumping;
using Aaru.Decoders.CD;
using Aaru.Decoders.DVD;
using Schemas;
using DMI = Aaru.Decoders.Xbox.DMI;
using Dump = Aaru.Core.Devices.Dumping.Dump;
using MediaType = Aaru.CommonTypes.MediaType;
using Partition = Aaru.CommonTypes.Partition;
using Session = Aaru.CommonTypes.Structs.Session;
using TrackType = Schemas.TrackType;
using Track = Aaru.CommonTypes.Structs.Track;
using TrackType = Aaru.CommonTypes.Enums.TrackType;
namespace Aaru.Core;
@@ -63,27 +64,26 @@ public sealed partial class Sidecar
/// <param name="sidecar">Metadata sidecar</param>
/// <param name="encoding">Encoding to be used for filesystem plugins</param>
void OpticalDisc(IOpticalMediaImage image, Guid filterId, string imagePath, FileInfo fi, PluginBase plugins,
List<ChecksumType> imgChecksums, ref CICMMetadataType sidecar, Encoding encoding)
List<CommonTypes.AaruMetadata.Checksum> imgChecksums, ref Metadata sidecar, Encoding encoding)
{
if(_aborted)
return;
sidecar.OpticalDisc = new[]
sidecar.OpticalDiscs = new List<OpticalDisc>
{
new OpticalDiscType
new()
{
Checksums = imgChecksums.ToArray(),
Image = new ImageType
Checksums = imgChecksums,
Image = new Image
{
format = image.Format,
offset = 0,
offsetSpecified = true,
Value = Path.GetFileName(imagePath)
Format = image.Format,
Offset = 0,
Value = Path.GetFileName(imagePath)
},
Size = (ulong)fi.Length,
Sequence = new SequenceType
Sequence = new Sequence
{
MediaTitle = image.Info.MediaTitle
Title = image.Info.MediaTitle
}
}
};
@@ -91,13 +91,13 @@ public sealed partial class Sidecar
if(image.Info.MediaSequence != 0 &&
image.Info.LastMediaSequence != 0)
{
sidecar.OpticalDisc[0].Sequence.MediaSequence = (uint)image.Info.MediaSequence;
sidecar.OpticalDisc[0].Sequence.TotalMedia = (uint)image.Info.LastMediaSequence;
sidecar.OpticalDiscs[0].Sequence.MediaSequence = (uint)image.Info.MediaSequence;
sidecar.OpticalDiscs[0].Sequence.TotalMedia = (uint)image.Info.LastMediaSequence;
}
else
{
sidecar.OpticalDisc[0].Sequence.MediaSequence = 1;
sidecar.OpticalDisc[0].Sequence.TotalMedia = 1;
sidecar.OpticalDiscs[0].Sequence.MediaSequence = 1;
sidecar.OpticalDiscs[0].Sequence.TotalMedia = 1;
}
MediaType dskType = image.Info.MediaType;
@@ -134,7 +134,7 @@ public sealed partial class Sidecar
{
dskType = MediaType.XGD;
sidecar.OpticalDisc[0].Dimensions = new DimensionsType
sidecar.OpticalDiscs[0].Dimensions = new DimensionsNew
{
Diameter = 120,
Thickness = 1.2
@@ -144,7 +144,7 @@ public sealed partial class Sidecar
{
dskType = MediaType.XGD2;
sidecar.OpticalDisc[0].Dimensions = new DimensionsType
sidecar.OpticalDiscs[0].Dimensions = new DimensionsNew
{
Diameter = 120,
Thickness = 1.2
@@ -194,29 +194,25 @@ public sealed partial class Sidecar
pfi.Value.DiscSize == DVDSize.OneTwenty)
dskType = MediaType.WOD;
sidecar.OpticalDisc[0].Dimensions = new DimensionsType();
sidecar.OpticalDiscs[0].Dimensions = new DimensionsNew();
if(dskType == MediaType.UMD)
{
sidecar.OpticalDisc[0].Dimensions.Height = 64;
sidecar.OpticalDisc[0].Dimensions.HeightSpecified = true;
sidecar.OpticalDisc[0].Dimensions.Width = 63;
sidecar.OpticalDisc[0].Dimensions.WidthSpecified = true;
sidecar.OpticalDisc[0].Dimensions.Thickness = 4;
sidecar.OpticalDiscs[0].Dimensions.Height = 64;
sidecar.OpticalDiscs[0].Dimensions.Width = 63;
sidecar.OpticalDiscs[0].Dimensions.Thickness = 4;
}
else
switch(pfi.Value.DiscSize)
{
case DVDSize.Eighty:
sidecar.OpticalDisc[0].Dimensions.Diameter = 80;
sidecar.OpticalDisc[0].Dimensions.DiameterSpecified = true;
sidecar.OpticalDisc[0].Dimensions.Thickness = 1.2;
sidecar.OpticalDiscs[0].Dimensions.Diameter = 80;
sidecar.OpticalDiscs[0].Dimensions.Thickness = 1.2;
break;
case DVDSize.OneTwenty:
sidecar.OpticalDisc[0].Dimensions.Diameter = 120;
sidecar.OpticalDisc[0].Dimensions.DiameterSpecified = true;
sidecar.OpticalDisc[0].Dimensions.Thickness = 1.2;
sidecar.OpticalDiscs[0].Dimensions.Diameter = 120;
sidecar.OpticalDiscs[0].Dimensions.Thickness = 1.2;
break;
}
@@ -229,26 +225,26 @@ public sealed partial class Sidecar
try
{
List<Session> sessions = image.Sessions;
sidecar.OpticalDisc[0].Sessions = (uint)(sessions?.Count ?? 1);
sidecar.OpticalDiscs[0].Sessions = (uint)(sessions?.Count ?? 1);
}
catch
{
sidecar.OpticalDisc[0].Sessions = 1;
sidecar.OpticalDiscs[0].Sessions = 1;
}
List<Track> tracks = image.Tracks;
List<TrackType> trksLst = null;
List<Track> tracks = image.Tracks;
List<CommonTypes.AaruMetadata.Track> trksLst = null;
if(tracks != null)
{
sidecar.OpticalDisc[0].Tracks = new uint[1];
sidecar.OpticalDisc[0].Tracks[0] = (uint)tracks.Count;
trksLst = new List<TrackType>();
sidecar.OpticalDiscs[0].Tracks = new uint[1];
sidecar.OpticalDiscs[0].Tracks[0] = (uint)tracks.Count;
trksLst = new List<CommonTypes.AaruMetadata.Track>();
}
if(sidecar.OpticalDisc[0].Dimensions == null &&
image.Info.MediaType != MediaType.Unknown)
sidecar.OpticalDisc[0].Dimensions = Dimensions.DimensionsFromMediaType(image.Info.MediaType);
if(sidecar.OpticalDiscs[0].Dimensions == null &&
image.Info.MediaType != MediaType.Unknown)
sidecar.OpticalDiscs[0].Dimensions = Dimensions.DimensionsFromMediaType(image.Info.MediaType);
if(_aborted)
return;
@@ -270,30 +266,30 @@ public sealed partial class Sidecar
return;
}
var xmlTrk = new TrackType();
var xmlTrk = new CommonTypes.AaruMetadata.Track();
xmlTrk.TrackType1 = trk.Type switch
xmlTrk.Type = trk.Type switch
{
CommonTypes.Enums.TrackType.Audio => TrackTypeTrackType.audio,
CommonTypes.Enums.TrackType.CdMode2Form2 => TrackTypeTrackType.m2f2,
CommonTypes.Enums.TrackType.CdMode2Formless => TrackTypeTrackType.mode2,
CommonTypes.Enums.TrackType.CdMode2Form1 => TrackTypeTrackType.m2f1,
CommonTypes.Enums.TrackType.CdMode1 => TrackTypeTrackType.mode1,
CommonTypes.Enums.TrackType.Data => sidecar.OpticalDisc[0].DiscType switch
TrackType.Audio => CommonTypes.AaruMetadata.TrackType.Audio,
TrackType.CdMode2Form2 => CommonTypes.AaruMetadata.TrackType.Mode2Form2,
TrackType.CdMode2Formless => CommonTypes.AaruMetadata.TrackType.Mode2,
TrackType.CdMode2Form1 => CommonTypes.AaruMetadata.TrackType.Mode2Form1,
TrackType.CdMode1 => CommonTypes.AaruMetadata.TrackType.Mode1,
TrackType.Data => sidecar.OpticalDiscs[0].DiscType switch
{
"BD" => TrackTypeTrackType.bluray,
"DDCD" => TrackTypeTrackType.ddcd,
"DVD" => TrackTypeTrackType.dvd,
"HD DVD" => TrackTypeTrackType.hddvd,
_ => TrackTypeTrackType.mode1
"BD" => CommonTypes.AaruMetadata.TrackType.Bluray,
"DDCD" => CommonTypes.AaruMetadata.TrackType.Ddcd,
"DVD" => CommonTypes.AaruMetadata.TrackType.Dvd,
"HD DVD" => CommonTypes.AaruMetadata.TrackType.HdDvd,
_ => CommonTypes.AaruMetadata.TrackType.Mode1
},
_ => xmlTrk.TrackType1
_ => xmlTrk.Type
};
xmlTrk.Sequence = new TrackSequenceType
xmlTrk.Sequence = new TrackSequence
{
Session = trk.Session,
TrackNumber = trk.Sequence
Session = trk.Session,
Number = trk.Sequence
};
xmlTrk.StartSector = trk.StartSector;
@@ -303,32 +299,29 @@ public sealed partial class Sidecar
idx0 >= 0)
xmlTrk.StartSector = (ulong)idx0;
switch(sidecar.OpticalDisc[0].DiscType)
switch(sidecar.OpticalDiscs[0].DiscType)
{
case "CD":
case "GD":
xmlTrk.StartMSF = LbaToMsf((long)xmlTrk.StartSector);
xmlTrk.EndMSF = LbaToMsf((long)xmlTrk.EndSector);
xmlTrk.StartMsf = LbaToMsf((long)xmlTrk.StartSector);
xmlTrk.EndMsf = LbaToMsf((long)xmlTrk.EndSector);
break;
case "DDCD":
xmlTrk.StartMSF = DdcdLbaToMsf((long)xmlTrk.StartSector);
xmlTrk.EndMSF = DdcdLbaToMsf((long)xmlTrk.EndSector);
xmlTrk.StartMsf = DdcdLbaToMsf((long)xmlTrk.StartSector);
xmlTrk.EndMsf = DdcdLbaToMsf((long)xmlTrk.EndSector);
break;
}
xmlTrk.Image = new ImageType
xmlTrk.Image = new Image
{
Value = Path.GetFileName(trk.File),
format = trk.FileType
Format = trk.FileType
};
if(trk.FileOffset > 0)
{
xmlTrk.Image.offset = trk.FileOffset;
xmlTrk.Image.offsetSpecified = true;
}
xmlTrk.Image.Offset = trk.FileOffset;
xmlTrk.Size = (xmlTrk.EndSector - xmlTrk.StartSector + 1) * (ulong)trk.RawBytesPerSector;
@@ -346,7 +339,7 @@ public sealed partial class Sidecar
// ...or AppleDouble
filterId == new Guid("1b2165ee-c9df-4b21-bbbb-9e5892b2df4d")))
xmlTrk.Checksums = sidecar.OpticalDisc[0].Checksums;
xmlTrk.Checksums = sidecar.OpticalDiscs[0].Checksums;
else
{
UpdateProgress(Localization.Core.Track_0_of_1, trk.Sequence, tracks.Count);
@@ -372,8 +365,7 @@ public sealed partial class Sidecar
if(sectors - doneSectors >= sectorsToRead)
{
errno = image.ReadSectorsLong(doneSectors, sectorsToRead, xmlTrk.Sequence.TrackNumber,
out sector);
errno = image.ReadSectorsLong(doneSectors, sectorsToRead, xmlTrk.Sequence.Number, out sector);
UpdateProgress2(Localization.Core.Hashing_sector_0_of_1, (long)doneSectors,
(long)(trk.EndSector - trk.StartSector + 1));
@@ -391,7 +383,7 @@ public sealed partial class Sidecar
else
{
errno = image.ReadSectorsLong(doneSectors, (uint)(sectors - doneSectors),
xmlTrk.Sequence.TrackNumber, out sector);
xmlTrk.Sequence.Number, out sector);
UpdateProgress2(Localization.Core.Hashing_sector_0_of_1, (long)doneSectors,
(long)(trk.EndSector - trk.StartSector + 1));
@@ -410,18 +402,16 @@ public sealed partial class Sidecar
trkChkWorker.Update(sector);
}
List<ChecksumType> trkChecksums = trkChkWorker.End();
xmlTrk.Checksums = trkChecksums.ToArray();
xmlTrk.Checksums = trkChkWorker.End();
EndProgress2();
}
if(trk.SubchannelType != TrackSubchannelType.None)
{
xmlTrk.SubChannel = new SubChannelType
xmlTrk.SubChannel = new SubChannel
{
Image = new ImageType
Image = new Image
{
Value = trk.SubchannelFile
},
@@ -434,26 +424,23 @@ public sealed partial class Sidecar
{
case TrackSubchannelType.Packed:
case TrackSubchannelType.PackedInterleaved:
xmlTrk.SubChannel.Image.format = "rw";
xmlTrk.SubChannel.Image.Format = "rw";
break;
case TrackSubchannelType.Raw:
case TrackSubchannelType.RawInterleaved:
xmlTrk.SubChannel.Image.format = "rw_raw";
xmlTrk.SubChannel.Image.Format = "rw_raw";
break;
case TrackSubchannelType.Q16:
case TrackSubchannelType.Q16Interleaved:
xmlTrk.SubChannel.Image.format = "q16";
xmlTrk.SubChannel.Image.Format = "q16";
break;
}
if(trk.FileOffset > 0)
{
xmlTrk.SubChannel.Image.offset = trk.SubchannelOffset;
xmlTrk.SubChannel.Image.offsetSpecified = true;
}
xmlTrk.SubChannel.Image.Offset = trk.SubchannelOffset;
var subChkWorker = new Checksum();
@@ -476,7 +463,7 @@ public sealed partial class Sidecar
if(sectors - doneSectors >= sectorsToRead)
{
errno = image.ReadSectorsTag(doneSectors, sectorsToRead, xmlTrk.Sequence.TrackNumber,
errno = image.ReadSectorsTag(doneSectors, sectorsToRead, xmlTrk.Sequence.Number,
SectorTagType.CdSectorSubchannel, out sector);
UpdateProgress2(Localization.Core.Hashing_subchannel_sector_0_of_1, (long)doneSectors,
@@ -494,9 +481,8 @@ public sealed partial class Sidecar
}
else
{
errno = image.ReadSectorsTag(doneSectors, (uint)(sectors - doneSectors),
xmlTrk.Sequence.TrackNumber, SectorTagType.CdSectorSubchannel,
out sector);
errno = image.ReadSectorsTag(doneSectors, (uint)(sectors - doneSectors), xmlTrk.Sequence.Number,
SectorTagType.CdSectorSubchannel, out sector);
UpdateProgress2(Localization.Core.Hashing_subchannel_sector_0_of_1, (long)doneSectors,
(long)(trk.EndSector - trk.StartSector + 1));
@@ -515,9 +501,7 @@ public sealed partial class Sidecar
subChkWorker.Update(sector);
}
List<ChecksumType> subChecksums = subChkWorker.End();
xmlTrk.SubChannel.Checksums = subChecksums.ToArray();
xmlTrk.SubChannel.Checksums = subChkWorker.End();
EndProgress2();
}
@@ -528,25 +512,23 @@ public sealed partial class Sidecar
List<Partition> trkPartitions =
partitions.Where(p => p.Start >= trk.StartSector && p.End <= trk.EndSector).ToList();
xmlTrk.FileSystemInformation = new PartitionType[1];
xmlTrk.FileSystemInformation = new List<CommonTypes.AaruMetadata.Partition>();
if(trkPartitions.Count > 0)
{
xmlTrk.FileSystemInformation = new PartitionType[trkPartitions.Count];
for(int i = 0; i < trkPartitions.Count; i++)
foreach(Partition partition in trkPartitions)
{
xmlTrk.FileSystemInformation[i] = new PartitionType
var metadataPartition = new CommonTypes.AaruMetadata.Partition
{
Description = trkPartitions[i].Description,
EndSector = trkPartitions[i].End,
Name = trkPartitions[i].Name,
Sequence = (uint)trkPartitions[i].Sequence,
StartSector = trkPartitions[i].Start,
Type = trkPartitions[i].Type
Description = partition.Description,
EndSector = partition.End,
Name = partition.Name,
Sequence = (uint)partition.Sequence,
StartSector = partition.Start,
Type = partition.Type
};
List<FileSystemType> lstFs = new();
List<FileSystem> lstFs = new();
foreach(IFilesystem plugin in plugins.PluginsList.Values)
try
@@ -558,14 +540,14 @@ public sealed partial class Sidecar
return;
}
if(!plugin.Identify(image, trkPartitions[i]))
if(!plugin.Identify(image, partition))
continue;
plugin.GetInformation(image, trkPartitions[i], out _, encoding);
lstFs.Add(plugin.XmlFsType);
Statistics.AddFilesystem(plugin.XmlFsType.Type);
plugin.GetInformation(image, partition, out _, encoding);
lstFs.Add(plugin.Metadata);
Statistics.AddFilesystem(plugin.Metadata.Type);
dskType = plugin.XmlFsType.Type switch
dskType = plugin.Metadata.Type switch
{
"Opera" => MediaType.ThreeDO,
"PC Engine filesystem" => MediaType.SuperCDROM2,
@@ -582,26 +564,28 @@ public sealed partial class Sidecar
}
if(lstFs.Count > 0)
xmlTrk.FileSystemInformation[i].FileSystems = lstFs.ToArray();
metadataPartition.FileSystems = lstFs;
xmlTrk.FileSystemInformation.Add(metadataPartition);
}
}
else
{
xmlTrk.FileSystemInformation[0] = new PartitionType
var metadataPartition = new CommonTypes.AaruMetadata.Partition
{
EndSector = xmlTrk.EndSector,
StartSector = xmlTrk.StartSector
};
List<FileSystemType> lstFs = new();
List<FileSystem> lstFs = new();
var xmlPart = new Partition
{
Start = xmlTrk.StartSector,
Length = xmlTrk.EndSector - xmlTrk.StartSector + 1,
Type = xmlTrk.TrackType1.ToString(),
Type = xmlTrk.Type.ToString(),
Size = xmlTrk.Size,
Sequence = xmlTrk.Sequence.TrackNumber
Sequence = xmlTrk.Sequence.Number
};
foreach(IFilesystem plugin in plugins.PluginsList.Values)
@@ -618,10 +602,10 @@ public sealed partial class Sidecar
continue;
plugin.GetInformation(image, xmlPart, out _, encoding);
lstFs.Add(plugin.XmlFsType);
Statistics.AddFilesystem(plugin.XmlFsType.Type);
lstFs.Add(plugin.Metadata);
Statistics.AddFilesystem(plugin.Metadata.Type);
dskType = plugin.XmlFsType.Type switch
dskType = plugin.Metadata.Type switch
{
"Opera" => MediaType.ThreeDO,
"PC Engine filesystem" => MediaType.SuperCDROM2,
@@ -638,7 +622,9 @@ public sealed partial class Sidecar
}
if(lstFs.Count > 0)
xmlTrk.FileSystemInformation[0].FileSystems = lstFs.ToArray();
metadataPartition.FileSystems = lstFs;
xmlTrk.FileSystemInformation.Add(metadataPartition);
}
errno = image.ReadSectorTag(trk.Sequence, SectorTagType.CdTrackIsrc, out byte[] isrcData);
@@ -652,7 +638,7 @@ public sealed partial class Sidecar
{
var trackFlags = (CdFlags)flagsData[0];
xmlTrk.Flags = new TrackFlagsType
xmlTrk.Flags = new TrackFlags
{
PreEmphasis = trackFlags.HasFlag(CdFlags.PreEmphasis),
CopyPermitted = trackFlags.HasFlag(CdFlags.CopyPermitted),
@@ -662,11 +648,11 @@ public sealed partial class Sidecar
}
if(trk.Indexes?.Count > 0)
xmlTrk.Indexes = trk.Indexes?.OrderBy(i => i.Key).Select(i => new TrackIndexType
xmlTrk.Indexes = trk.Indexes?.OrderBy(i => i.Key).Select(i => new TrackIndex
{
index = i.Key,
Index = i.Key,
Value = i.Value
}).ToArray();
}).ToList();
trksLst.Add(xmlTrk);
}
@@ -674,36 +660,37 @@ public sealed partial class Sidecar
EndProgress();
if(trksLst != null)
sidecar.OpticalDisc[0].Track = trksLst.ToArray();
sidecar.OpticalDiscs[0].Track = trksLst;
// All XGD3 all have the same number of blocks
if(dskType == MediaType.XGD2 &&
sidecar.OpticalDisc[0].Track.Length == 1)
sidecar.OpticalDiscs[0].Track.Count == 1)
{
ulong blocks = sidecar.OpticalDisc[0].Track[0].EndSector - sidecar.OpticalDisc[0].Track[0].StartSector + 1;
ulong blocks = sidecar.OpticalDiscs[0].Track[0].EndSector - sidecar.OpticalDiscs[0].Track[0].StartSector +
1;
if(blocks is 25063 or 4229664 or 4246304) // Wxripper unlock
dskType = MediaType.XGD3;
}
(string type, string subType) discType = CommonTypes.Metadata.MediaType.MediaTypeToString(dskType);
sidecar.OpticalDisc[0].DiscType = discType.type;
sidecar.OpticalDisc[0].DiscSubType = discType.subType;
sidecar.OpticalDiscs[0].DiscType = discType.type;
sidecar.OpticalDiscs[0].DiscSubType = discType.subType;
Statistics.AddMedia(dskType, false);
if(image.DumpHardware != null)
sidecar.OpticalDisc[0].DumpHardwareArray = image.DumpHardware.ToArray();
sidecar.OpticalDiscs[0].DumpHardware = image.DumpHardware;
else if(!string.IsNullOrEmpty(image.Info.DriveManufacturer) ||
!string.IsNullOrEmpty(image.Info.DriveModel) ||
!string.IsNullOrEmpty(image.Info.DriveFirmwareRevision) ||
!string.IsNullOrEmpty(image.Info.DriveSerialNumber))
sidecar.OpticalDisc[0].DumpHardwareArray = new[]
sidecar.OpticalDiscs[0].DumpHardware = new List<DumpHardware>
{
new DumpHardwareType
new()
{
Extents = new[]
Extents = new List<Extent>
{
new ExtentType
new()
{
Start = 0,
End = image.Info.Sectors
@@ -713,7 +700,7 @@ public sealed partial class Sidecar
Model = image.Info.DriveModel,
Firmware = image.Info.DriveFirmwareRevision,
Serial = image.Info.DriveSerialNumber,
Software = new SoftwareType
Software = new Software
{
Name = image.Info.Application,
Version = image.Info.ApplicationVersion

View File

@@ -35,27 +35,27 @@ using System.Collections.Generic;
using System.IO;
using System.Text;
using Aaru.CommonTypes;
using Aaru.CommonTypes.AaruMetadata;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces;
using Aaru.Console;
using Aaru.Helpers;
using Schemas;
namespace Aaru.Core;
public sealed partial class Sidecar
{
readonly ChecksumType[] _emptyChecksums;
readonly Encoding _encoding;
readonly FileInfo _fi;
readonly Guid _filterId;
readonly IBaseImage _image;
readonly string _imagePath;
readonly Checksum _imgChkWorker;
readonly PluginBase _plugins;
bool _aborted;
FileStream _fs;
CICMMetadataType _sidecar;
readonly List<CommonTypes.AaruMetadata.Checksum> _emptyChecksums;
readonly Encoding _encoding;
readonly FileInfo _fi;
readonly Guid _filterId;
readonly IBaseImage _image;
readonly string _imagePath;
readonly Checksum _imgChkWorker;
readonly PluginBase _plugins;
bool _aborted;
FileStream _fs;
Metadata _sidecar;
/// <summary>Initializes a new instance of this class</summary>
public Sidecar()
@@ -66,7 +66,7 @@ public sealed partial class Sidecar
var emptyChkWorker = new Checksum();
emptyChkWorker.Update(Array.Empty<byte>());
_emptyChecksums = emptyChkWorker.End().ToArray();
_emptyChecksums = emptyChkWorker.End();
}
/// <param name="image">Image</param>
@@ -79,7 +79,7 @@ public sealed partial class Sidecar
_imagePath = imagePath;
_filterId = filterId;
_encoding = encoding;
_sidecar = image.CicmMetadata ?? new CICMMetadataType();
_sidecar = image.AaruMetadata ?? new Metadata();
_plugins = GetPluginBase.Instance;
_fi = new FileInfo(imagePath);
_fs = new FileStream(imagePath, FileMode.Open, FileAccess.Read);
@@ -89,7 +89,7 @@ public sealed partial class Sidecar
/// <summary>Implements creating a metadata sidecar</summary>
/// <returns>The metadata sidecar</returns>
public CICMMetadataType Create()
public Metadata Create()
{
// For fast debugging, skip checksum
//goto skipImageChecksum;
@@ -127,19 +127,14 @@ public sealed partial class Sidecar
EndProgress();
_fs.Close();
List<ChecksumType> imgChecksums = _imgChkWorker.End();
_sidecar.OpticalDisc = null;
_sidecar.BlockMedia = null;
_sidecar.AudioMedia = null;
_sidecar.LinearMedia = null;
List<CommonTypes.AaruMetadata.Checksum> imgChecksums = _imgChkWorker.End();
if(_aborted)
return _sidecar;
switch(_image.Info.XmlMediaType)
switch(_image.Info.MetadataMediaType)
{
case XmlMediaType.OpticalDisc:
case MetadataMediaType.OpticalDisc:
if(_image is IOpticalMediaImage opticalImage)
OpticalDisc(opticalImage, _filterId, _imagePath, _fi, _plugins, imgChecksums, ref _sidecar,
_encoding);
@@ -152,7 +147,7 @@ public sealed partial class Sidecar
}
break;
case XmlMediaType.BlockMedia:
case MetadataMediaType.BlockMedia:
if(_image is IMediaImage blockImage)
BlockMedia(blockImage, _filterId, _imagePath, _fi, _plugins, imgChecksums, ref _sidecar, _encoding);
else
@@ -164,7 +159,7 @@ public sealed partial class Sidecar
}
break;
case XmlMediaType.LinearMedia:
case MetadataMediaType.LinearMedia:
if(_image is IByteAddressableImage byteAddressableImage)
LinearMedia(byteAddressableImage, _filterId, _imagePath, _fi, _plugins, imgChecksums, ref _sidecar,
_encoding);
@@ -177,7 +172,7 @@ public sealed partial class Sidecar
}
break;
case XmlMediaType.AudioMedia:
case MetadataMediaType.AudioMedia:
AudioMedia(_image, _filterId, _imagePath, _fi, _plugins, imgChecksums, ref _sidecar, _encoding);
break;