Use Spectre for image info command.

This commit is contained in:
2021-09-14 00:56:06 +01:00
parent caa39e9997
commit df0dbe33d7
2 changed files with 176 additions and 111 deletions

View File

@@ -48,6 +48,7 @@ using Aaru.Decoders.SCSI;
using Aaru.Decoders.Xbox; using Aaru.Decoders.Xbox;
using Aaru.Helpers; using Aaru.Helpers;
using Schemas; using Schemas;
using Spectre.Console;
using DDS = Aaru.Decoders.DVD.DDS; using DDS = Aaru.Decoders.DVD.DDS;
using DMI = Aaru.Decoders.Xbox.DMI; using DMI = Aaru.Decoders.Xbox.DMI;
using Inquiry = Aaru.Decoders.SCSI.Inquiry; using Inquiry = Aaru.Decoders.SCSI.Inquiry;
@@ -72,19 +73,23 @@ namespace Aaru.Core
/// <param name="imageFormat">Media image</param> /// <param name="imageFormat">Media image</param>
public static void PrintImageInfo(IMediaImage imageFormat) public static void PrintImageInfo(IMediaImage imageFormat)
{ {
AaruConsole.WriteLine("Image information:"); Table table;
AaruConsole.WriteLine("[bold]Image information:[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Version)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.Version))
AaruConsole.WriteLine("Format: {0} version {1}", imageFormat.Format, imageFormat.Info.Version); AaruConsole.WriteLine("[bold]Format:[/] [italic]{0}[/] version {1}", Markup.Escape(imageFormat.Format),
Markup.Escape(imageFormat.Info.Version));
else else
AaruConsole.WriteLine("Format: {0}", imageFormat.Format); AaruConsole.WriteLine("[bold]Format:[/] [italic]{0}[/]", Markup.Escape(imageFormat.Format));
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Application) && if(!string.IsNullOrWhiteSpace(imageFormat.Info.Application) &&
!string.IsNullOrWhiteSpace(imageFormat.Info.ApplicationVersion)) !string.IsNullOrWhiteSpace(imageFormat.Info.ApplicationVersion))
AaruConsole.WriteLine("Was created with {0} version {1}", imageFormat.Info.Application, AaruConsole.WriteLine("Was created with [italic]{0}[/] version [italic]{1}[/]",
imageFormat.Info.ApplicationVersion); Markup.Escape(imageFormat.Info.Application),
Markup.Escape(imageFormat.Info.ApplicationVersion));
else if(!string.IsNullOrWhiteSpace(imageFormat.Info.Application)) else if(!string.IsNullOrWhiteSpace(imageFormat.Info.Application))
AaruConsole.WriteLine("Was created with {0}", imageFormat.Info.Application); AaruConsole.WriteLine("Was created with [italic]{0}[/]", Markup.Escape(imageFormat.Info.Application));
AaruConsole.WriteLine("Image without headers is {0} bytes long", imageFormat.Info.ImageSize); AaruConsole.WriteLine("Image without headers is {0} bytes long", imageFormat.Info.ImageSize);
@@ -94,7 +99,7 @@ namespace Aaru.Core
imageFormat.Info.Sectors * imageFormat.Info.SectorSize); imageFormat.Info.Sectors * imageFormat.Info.SectorSize);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Creator)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.Creator))
AaruConsole.WriteLine("Created by: {0}", imageFormat.Info.Creator); AaruConsole.WriteLine("[bold]Created by:[/] {0}", Markup.Escape(imageFormat.Info.Creator));
if(imageFormat.Info.CreationTime != DateTime.MinValue) if(imageFormat.Info.CreationTime != DateTime.MinValue)
AaruConsole.WriteLine("Created on {0}", imageFormat.Info.CreationTime); AaruConsole.WriteLine("Created on {0}", imageFormat.Info.CreationTime);
@@ -102,14 +107,14 @@ namespace Aaru.Core
if(imageFormat.Info.LastModificationTime != DateTime.MinValue) if(imageFormat.Info.LastModificationTime != DateTime.MinValue)
AaruConsole.WriteLine("Last modified on {0}", imageFormat.Info.LastModificationTime); AaruConsole.WriteLine("Last modified on {0}", imageFormat.Info.LastModificationTime);
AaruConsole.WriteLine("Contains a media of type {0} and XML type {1}", imageFormat.Info.MediaType, AaruConsole.WriteLine("Contains a media of type [italic]{0}[/] and XML type [italic]{1}[/]",
imageFormat.Info.XmlMediaType); imageFormat.Info.MediaType, imageFormat.Info.XmlMediaType);
AaruConsole.WriteLine("{0} partitions", imageFormat.Info.HasPartitions ? "Has" : "Doesn't have"); AaruConsole.WriteLine("{0} partitions", imageFormat.Info.HasPartitions ? "Has" : "Doesn't have");
AaruConsole.WriteLine("{0} sessions", imageFormat.Info.HasSessions ? "Has" : "Doesn't have"); AaruConsole.WriteLine("{0} sessions", imageFormat.Info.HasSessions ? "Has" : "Doesn't have");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Comments)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.Comments))
AaruConsole.WriteLine("Comments: {0}", imageFormat.Info.Comments); AaruConsole.WriteLine("[bold]Comments:[/] {0}", Markup.Escape(imageFormat.Info.Comments));
if(imageFormat.Info.MediaSequence != 0 && if(imageFormat.Info.MediaSequence != 0 &&
imageFormat.Info.LastMediaSequence != 0) imageFormat.Info.LastMediaSequence != 0)
@@ -117,51 +122,62 @@ namespace Aaru.Core
imageFormat.Info.LastMediaSequence); imageFormat.Info.LastMediaSequence);
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaTitle)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaTitle))
AaruConsole.WriteLine("Media title: {0}", imageFormat.Info.MediaTitle); AaruConsole.WriteLine("[bold]Media title:[/] [italic]{0}[/]",
Markup.Escape(imageFormat.Info.MediaTitle));
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaManufacturer)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaManufacturer))
AaruConsole.WriteLine("Media manufacturer: {0}", imageFormat.Info.MediaManufacturer); AaruConsole.WriteLine("[bold]Media manufacturer:[/] [italic]{0}[/]",
Markup.Escape(imageFormat.Info.MediaManufacturer));
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaModel)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaModel))
AaruConsole.WriteLine("Media model: {0}", imageFormat.Info.MediaModel); AaruConsole.WriteLine("[bold]Media model:[/] [italic]{0}[/]",
Markup.Escape(imageFormat.Info.MediaModel));
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaSerialNumber)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaSerialNumber))
AaruConsole.WriteLine("Media serial number: {0}", imageFormat.Info.MediaSerialNumber); AaruConsole.WriteLine("[bold]Media serial number:[/] [italic]{0}[/]",
Markup.Escape(imageFormat.Info.MediaSerialNumber));
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaBarcode)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaBarcode))
AaruConsole.WriteLine("Media barcode: {0}", imageFormat.Info.MediaBarcode); AaruConsole.WriteLine("[bold]Media barcode:[/] [italic]{0}[/]",
Markup.Escape(imageFormat.Info.MediaBarcode));
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaPartNumber)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaPartNumber))
AaruConsole.WriteLine("Media part number: {0}", imageFormat.Info.MediaPartNumber); AaruConsole.WriteLine("[bold]Media part number:[/] [italic]{0}[/]",
Markup.Escape(imageFormat.Info.MediaPartNumber));
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveManufacturer)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveManufacturer))
AaruConsole.WriteLine("Drive manufacturer: {0}", imageFormat.Info.DriveManufacturer); AaruConsole.WriteLine("[bold]Drive manufacturer:[/] [italic]{0}[/]",
Markup.Escape(imageFormat.Info.DriveManufacturer));
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveModel)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveModel))
AaruConsole.WriteLine("Drive model: {0}", imageFormat.Info.DriveModel); AaruConsole.WriteLine("[bold]Drive model:[/] [italic]{0}[/]",
Markup.Escape(imageFormat.Info.DriveModel));
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveSerialNumber)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveSerialNumber))
AaruConsole.WriteLine("Drive serial number: {0}", imageFormat.Info.DriveSerialNumber); AaruConsole.WriteLine("[bold]Drive serial number:[/] [italic]{0}[/]",
Markup.Escape(imageFormat.Info.DriveSerialNumber));
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveFirmwareRevision)) if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveFirmwareRevision))
AaruConsole.WriteLine("Drive firmware info: {0}", imageFormat.Info.DriveFirmwareRevision); AaruConsole.WriteLine("[bold]Drive firmware info:[/] [italic]{0}[/]",
Markup.Escape(imageFormat.Info.DriveFirmwareRevision));
if(imageFormat.Info.Cylinders > 0 && if(imageFormat.Info.Cylinders > 0 &&
imageFormat.Info.Heads > 0 && imageFormat.Info.Heads > 0 &&
imageFormat.Info.SectorsPerTrack > 0 && imageFormat.Info.SectorsPerTrack > 0 &&
imageFormat.Info.XmlMediaType != XmlMediaType.OpticalDisc && imageFormat.Info.XmlMediaType != XmlMediaType.OpticalDisc &&
(!(imageFormat is ITapeImage tapeImage) || !tapeImage.IsTape)) (!(imageFormat is ITapeImage tapeImage) || !tapeImage.IsTape))
AaruConsole.WriteLine("Media geometry: {0} cylinders, {1} heads, {2} sectors per track", AaruConsole.
imageFormat.Info.Cylinders, imageFormat.Info.Heads, WriteLine("[bold]Media geometry:[/] [italic]{0} cylinders, {1} heads, {2} sectors per track[/]",
imageFormat.Info.SectorsPerTrack); imageFormat.Info.Cylinders, imageFormat.Info.Heads, imageFormat.Info.SectorsPerTrack);
if(imageFormat.Info.ReadableMediaTags != null && if(imageFormat.Info.ReadableMediaTags != null &&
imageFormat.Info.ReadableMediaTags.Count > 0) imageFormat.Info.ReadableMediaTags.Count > 0)
{ {
AaruConsole.WriteLine("Contains {0} readable media tags:", imageFormat.Info.ReadableMediaTags.Count); AaruConsole.WriteLine("[bold]Contains {0} readable media tags:[/]",
imageFormat.Info.ReadableMediaTags.Count);
foreach(MediaTagType tag in imageFormat.Info.ReadableMediaTags.OrderBy(t => t)) foreach(MediaTagType tag in imageFormat.Info.ReadableMediaTags.OrderBy(t => t))
AaruConsole.Write("{0} ", tag); AaruConsole.Write("[italic]{0}[/] ", Markup.Escape(tag.ToString()));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -169,10 +185,11 @@ namespace Aaru.Core
if(imageFormat.Info.ReadableSectorTags != null && if(imageFormat.Info.ReadableSectorTags != null &&
imageFormat.Info.ReadableSectorTags.Count > 0) imageFormat.Info.ReadableSectorTags.Count > 0)
{ {
AaruConsole.WriteLine("Contains {0} readable sector tags:", imageFormat.Info.ReadableSectorTags.Count); AaruConsole.WriteLine("[bold]Contains {0} readable sector tags:[/]",
imageFormat.Info.ReadableSectorTags.Count);
foreach(SectorTagType tag in imageFormat.Info.ReadableSectorTags.OrderBy(t => t)) foreach(SectorTagType tag in imageFormat.Info.ReadableSectorTags.OrderBy(t => t))
AaruConsole.Write("{0} ", tag); AaruConsole.Write("[italic]{0}[/] ", tag);
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -193,7 +210,7 @@ namespace Aaru.Core
Array.Copy(inquiry, 8, scsiVendorId, 0, 8); Array.Copy(inquiry, 8, scsiVendorId, 0, 8);
} }
AaruConsole.WriteLine("SCSI INQUIRY contained in image:"); AaruConsole.WriteLine("[bold]SCSI INQUIRY contained in image:[/]");
AaruConsole.Write("{0}", Inquiry.Prettify(inquiry)); AaruConsole.Write("{0}", Inquiry.Prettify(inquiry));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -202,7 +219,7 @@ namespace Aaru.Core
{ {
byte[] identify = imageFormat.ReadDiskTag(MediaTagType.ATA_IDENTIFY); byte[] identify = imageFormat.ReadDiskTag(MediaTagType.ATA_IDENTIFY);
AaruConsole.WriteLine("ATA IDENTIFY contained in image:"); AaruConsole.WriteLine("[bold]ATA IDENTIFY contained in image:[/]");
AaruConsole.Write("{0}", Identify.Prettify(identify)); AaruConsole.Write("{0}", Identify.Prettify(identify));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -211,7 +228,7 @@ namespace Aaru.Core
{ {
byte[] identify = imageFormat.ReadDiskTag(MediaTagType.ATAPI_IDENTIFY); byte[] identify = imageFormat.ReadDiskTag(MediaTagType.ATAPI_IDENTIFY);
AaruConsole.WriteLine("ATAPI IDENTIFY contained in image:"); AaruConsole.WriteLine("[bold]ATAPI IDENTIFY contained in image:[/]");
AaruConsole.Write("{0}", Identify.Prettify(identify)); AaruConsole.Write("{0}", Identify.Prettify(identify));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -223,7 +240,7 @@ namespace Aaru.Core
if(decMode.HasValue) if(decMode.HasValue)
{ {
AaruConsole.WriteLine("SCSI MODE SENSE (10) contained in image:"); AaruConsole.WriteLine("[bold]SCSI MODE SENSE (10) contained in image:[/]");
PrintScsiModePages.Print(decMode.Value, scsiDeviceType, scsiVendorId); PrintScsiModePages.Print(decMode.Value, scsiDeviceType, scsiVendorId);
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -235,7 +252,7 @@ namespace Aaru.Core
if(decMode.HasValue) if(decMode.HasValue)
{ {
AaruConsole.WriteLine("SCSI MODE SENSE (6) contained in image:"); AaruConsole.WriteLine("[bold]SCSI MODE SENSE (6) contained in image:[/]");
PrintScsiModePages.Print(decMode.Value, scsiDeviceType, scsiVendorId); PrintScsiModePages.Print(decMode.Value, scsiDeviceType, scsiVendorId);
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -265,7 +282,7 @@ namespace Aaru.Core
toc = tmp; toc = tmp;
} }
AaruConsole.WriteLine("CompactDisc Table of Contents contained in image:"); AaruConsole.WriteLine("[bold]CompactDisc Table of Contents contained in image:[/]");
AaruConsole.Write("{0}", FullTOC.Prettify(toc)); AaruConsole.Write("{0}", FullTOC.Prettify(toc));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -288,7 +305,7 @@ namespace Aaru.Core
pma = tmp; pma = tmp;
} }
AaruConsole.WriteLine("CompactDisc Power Management Area contained in image:"); AaruConsole.WriteLine("[bold]CompactDisc Power Management Area contained in image:[/]");
AaruConsole.Write("{0}", PMA.Prettify(pma)); AaruConsole.Write("{0}", PMA.Prettify(pma));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -311,7 +328,7 @@ namespace Aaru.Core
atip = tmp; atip = tmp;
} }
AaruConsole.WriteLine("CompactDisc Absolute Time In Pregroove (ATIP) contained in image:"); AaruConsole.WriteLine("[bold]CompactDisc Absolute Time In Pregroove (ATIP) contained in image:[/]");
AaruConsole.Write("{0}", ATIP.Prettify(atip)); AaruConsole.Write("{0}", ATIP.Prettify(atip));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -333,7 +350,7 @@ namespace Aaru.Core
cdtext = tmp; cdtext = tmp;
} }
AaruConsole.WriteLine("CompactDisc Lead-in's CD-Text contained in image:"); AaruConsole.WriteLine("[bold]CompactDisc Lead-in's CD-Text contained in image:[/]");
AaruConsole.Write("{0}", CDTextOnLeadIn.Prettify(cdtext)); AaruConsole.Write("{0}", CDTextOnLeadIn.Prettify(cdtext));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -342,7 +359,7 @@ namespace Aaru.Core
{ {
byte[] mcn = imageFormat.ReadDiskTag(MediaTagType.CD_MCN); byte[] mcn = imageFormat.ReadDiskTag(MediaTagType.CD_MCN);
AaruConsole.WriteLine("CompactDisc Media Catalogue Number contained in image: {0}", AaruConsole.WriteLine("[bold]CompactDisc Media Catalogue Number contained in image:[/] {0}",
Encoding.UTF8.GetString(mcn)); Encoding.UTF8.GetString(mcn));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
@@ -352,7 +369,7 @@ namespace Aaru.Core
{ {
byte[] pri = imageFormat.ReadDiskTag(MediaTagType.DVDR_PreRecordedInfo); byte[] pri = imageFormat.ReadDiskTag(MediaTagType.DVDR_PreRecordedInfo);
AaruConsole.WriteLine("DVD-R(W) Pre-Recorded Information:"); AaruConsole.WriteLine("[bold]DVD-R(W) Pre-Recorded Information:[/]");
AaruConsole.Write("{0}", PRI.Prettify(pri)); AaruConsole.Write("{0}", PRI.Prettify(pri));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -361,7 +378,7 @@ namespace Aaru.Core
{ {
byte[] pfi = imageFormat.ReadDiskTag(MediaTagType.DVD_PFI); byte[] pfi = imageFormat.ReadDiskTag(MediaTagType.DVD_PFI);
AaruConsole.WriteLine("DVD Physical Format Information contained in image:"); AaruConsole.WriteLine("[bold]DVD Physical Format Information contained in image:[/]");
AaruConsole.Write("{0}", PFI.Prettify(pfi, imageFormat.Info.MediaType)); AaruConsole.Write("{0}", PFI.Prettify(pfi, imageFormat.Info.MediaType));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -370,7 +387,7 @@ namespace Aaru.Core
{ {
byte[] dds = imageFormat.ReadDiskTag(MediaTagType.DVDRAM_DDS); byte[] dds = imageFormat.ReadDiskTag(MediaTagType.DVDRAM_DDS);
AaruConsole.WriteLine("DVD-RAM Disc Definition Structure contained in image:"); AaruConsole.WriteLine("[bold]DVD-RAM Disc Definition Structure contained in image:[/]");
AaruConsole.Write("{0}", DDS.Prettify(dds)); AaruConsole.Write("{0}", DDS.Prettify(dds));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -379,7 +396,7 @@ namespace Aaru.Core
{ {
byte[] pfi = imageFormat.ReadDiskTag(MediaTagType.DVDR_PFI); byte[] pfi = imageFormat.ReadDiskTag(MediaTagType.DVDR_PFI);
AaruConsole.WriteLine("DVD-R Physical Format Information contained in image:"); AaruConsole.WriteLine("[bold]DVD-R Physical Format Information contained in image:[/]");
AaruConsole.Write("{0}", PFI.Prettify(pfi, imageFormat.Info.MediaType)); AaruConsole.Write("{0}", PFI.Prettify(pfi, imageFormat.Info.MediaType));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -388,7 +405,7 @@ namespace Aaru.Core
{ {
byte[] di = imageFormat.ReadDiskTag(MediaTagType.BD_DI); byte[] di = imageFormat.ReadDiskTag(MediaTagType.BD_DI);
AaruConsole.WriteLine("Bluray Disc Information contained in image:"); AaruConsole.WriteLine("[bold]Bluray Disc Information contained in image:[/]");
AaruConsole.Write("{0}", DI.Prettify(di)); AaruConsole.Write("{0}", DI.Prettify(di));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -397,7 +414,7 @@ namespace Aaru.Core
{ {
byte[] dds = imageFormat.ReadDiskTag(MediaTagType.BD_DDS); byte[] dds = imageFormat.ReadDiskTag(MediaTagType.BD_DDS);
AaruConsole.WriteLine("Bluray Disc Definition Structure contained in image:"); AaruConsole.WriteLine("[bold]Bluray Disc Definition Structure contained in image:[/]");
AaruConsole.Write("{0}", Decoders.Bluray.DDS.Prettify(dds)); AaruConsole.Write("{0}", Decoders.Bluray.DDS.Prettify(dds));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -406,7 +423,7 @@ namespace Aaru.Core
{ {
byte[] cis = imageFormat.ReadDiskTag(MediaTagType.PCMCIA_CIS); byte[] cis = imageFormat.ReadDiskTag(MediaTagType.PCMCIA_CIS);
AaruConsole.WriteLine("PCMCIA CIS:"); AaruConsole.WriteLine("[bold]PCMCIA CIS:[/]");
Tuple[] tuples = CIS.GetTuples(cis); Tuple[] tuples = CIS.GetTuples(cis);
if(tuples != null) if(tuples != null)
@@ -480,7 +497,7 @@ namespace Aaru.Core
{ {
byte[] cid = imageFormat.ReadDiskTag(MediaTagType.SD_CID); byte[] cid = imageFormat.ReadDiskTag(MediaTagType.SD_CID);
AaruConsole.WriteLine("SecureDigital CID contained in image:"); AaruConsole.WriteLine("[bold]SecureDigital CID contained in image:[/]");
AaruConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifyCID(cid)); AaruConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifyCID(cid));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -489,7 +506,7 @@ namespace Aaru.Core
{ {
byte[] csd = imageFormat.ReadDiskTag(MediaTagType.SD_CSD); byte[] csd = imageFormat.ReadDiskTag(MediaTagType.SD_CSD);
AaruConsole.WriteLine("SecureDigital CSD contained in image:"); AaruConsole.WriteLine("[bold]SecureDigital CSD contained in image:[/]");
AaruConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifyCSD(csd)); AaruConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifyCSD(csd));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -498,7 +515,7 @@ namespace Aaru.Core
{ {
byte[] scr = imageFormat.ReadDiskTag(MediaTagType.SD_SCR); byte[] scr = imageFormat.ReadDiskTag(MediaTagType.SD_SCR);
AaruConsole.WriteLine("SecureDigital SCR contained in image:"); AaruConsole.WriteLine("[bold]SecureDigital SCR contained in image:[/]");
AaruConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifySCR(scr)); AaruConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifySCR(scr));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -507,7 +524,7 @@ namespace Aaru.Core
{ {
byte[] ocr = imageFormat.ReadDiskTag(MediaTagType.SD_OCR); byte[] ocr = imageFormat.ReadDiskTag(MediaTagType.SD_OCR);
AaruConsole.WriteLine("SecureDigital OCR contained in image:"); AaruConsole.WriteLine("[bold]SecureDigital OCR contained in image:[/]");
AaruConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifyOCR(ocr)); AaruConsole.Write("{0}", Decoders.SecureDigital.Decoders.PrettifyOCR(ocr));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -516,7 +533,7 @@ namespace Aaru.Core
{ {
byte[] cid = imageFormat.ReadDiskTag(MediaTagType.MMC_CID); byte[] cid = imageFormat.ReadDiskTag(MediaTagType.MMC_CID);
AaruConsole.WriteLine("MultiMediaCard CID contained in image:"); AaruConsole.WriteLine("[bold]MultiMediaCard CID contained in image:[/]");
AaruConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyCID(cid)); AaruConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyCID(cid));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -525,7 +542,7 @@ namespace Aaru.Core
{ {
byte[] csd = imageFormat.ReadDiskTag(MediaTagType.MMC_CSD); byte[] csd = imageFormat.ReadDiskTag(MediaTagType.MMC_CSD);
AaruConsole.WriteLine("MultiMediaCard CSD contained in image:"); AaruConsole.WriteLine("[bold]MultiMediaCard CSD contained in image:[/]");
AaruConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyCSD(csd)); AaruConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyCSD(csd));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -534,7 +551,7 @@ namespace Aaru.Core
{ {
byte[] ecsd = imageFormat.ReadDiskTag(MediaTagType.MMC_ExtendedCSD); byte[] ecsd = imageFormat.ReadDiskTag(MediaTagType.MMC_ExtendedCSD);
AaruConsole.WriteLine("MultiMediaCard ExtendedCSD contained in image:"); AaruConsole.WriteLine("[bold]MultiMediaCard ExtendedCSD contained in image:[/]");
AaruConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyExtendedCSD(ecsd)); AaruConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyExtendedCSD(ecsd));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -543,7 +560,7 @@ namespace Aaru.Core
{ {
byte[] ocr = imageFormat.ReadDiskTag(MediaTagType.MMC_OCR); byte[] ocr = imageFormat.ReadDiskTag(MediaTagType.MMC_OCR);
AaruConsole.WriteLine("MultiMediaCard OCR contained in image:"); AaruConsole.WriteLine("[bold]MultiMediaCard OCR contained in image:[/]");
AaruConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyOCR(ocr)); AaruConsole.Write("{0}", Decoders.MMC.Decoders.PrettifyOCR(ocr));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -552,7 +569,7 @@ namespace Aaru.Core
{ {
byte[] xpfi = imageFormat.ReadDiskTag(MediaTagType.Xbox_PFI); byte[] xpfi = imageFormat.ReadDiskTag(MediaTagType.Xbox_PFI);
AaruConsole.WriteLine("Xbox Physical Format Information contained in image:"); AaruConsole.WriteLine("[bold]Xbox Physical Format Information contained in image:[/]");
AaruConsole.Write("{0}", PFI.Prettify(xpfi, imageFormat.Info.MediaType)); AaruConsole.Write("{0}", PFI.Prettify(xpfi, imageFormat.Info.MediaType));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -567,7 +584,7 @@ namespace Aaru.Core
if(xmi.HasValue) if(xmi.HasValue)
{ {
AaruConsole.WriteLine("Xbox DMI contained in image:"); AaruConsole.WriteLine("[bold]Xbox DMI contained in image:[/]");
AaruConsole.Write("{0}", DMI.PrettifyXbox(xmi)); AaruConsole.Write("{0}", DMI.PrettifyXbox(xmi));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -579,7 +596,7 @@ namespace Aaru.Core
if(xmi.HasValue) if(xmi.HasValue)
{ {
AaruConsole.WriteLine("Xbox 360 DMI contained in image:"); AaruConsole.WriteLine("[bold]Xbox 360 DMI contained in image:[/]");
AaruConsole.Write("{0}", DMI.PrettifyXbox360(xmi)); AaruConsole.Write("{0}", DMI.PrettifyXbox360(xmi));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -590,7 +607,7 @@ namespace Aaru.Core
{ {
byte[] toc = imageFormat.ReadDiskTag(MediaTagType.Xbox_SecuritySector); byte[] toc = imageFormat.ReadDiskTag(MediaTagType.Xbox_SecuritySector);
AaruConsole.WriteLine("Xbox Security Sectors contained in image:"); AaruConsole.WriteLine("[bold]Xbox Security Sectors contained in image:[/]");
AaruConsole.Write("{0}", SS.Prettify(toc)); AaruConsole.Write("{0}", SS.Prettify(toc));
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
@@ -602,18 +619,23 @@ namespace Aaru.Core
if(opticalImage.Sessions != null && if(opticalImage.Sessions != null &&
opticalImage.Sessions.Count > 0) opticalImage.Sessions.Count > 0)
{ {
AaruConsole.WriteLine("Image sessions:"); table = new Table
{
Title = new TableTitle("Image sessions")
};
AaruConsole.WriteLine("{0,-9}{1,-13}{2,-12}{3,-12}{4,-12}", "Session", "First track", table.AddColumn("Session");
"Last track", "Start", "End"); table.AddColumn("First track");
table.AddColumn("Last track");
AaruConsole.WriteLine("========================================================="); table.AddColumn("Start");
table.AddColumn("End");
foreach(Session session in opticalImage.Sessions) foreach(Session session in opticalImage.Sessions)
AaruConsole.WriteLine("{0,-9}{1,-13}{2,-12}{3,-12}{4,-12}", session.SessionSequence, table.AddRow(session.SessionSequence.ToString(), session.StartTrack.ToString(),
session.StartTrack, session.EndTrack, session.StartSector, session.EndTrack.ToString(), session.StartSector.ToString(),
session.EndSector); session.EndSector.ToString());
AnsiConsole.Render(table);
AaruConsole.WriteLine(); AaruConsole.WriteLine();
} }
} }
@@ -627,34 +649,47 @@ namespace Aaru.Core
if(opticalImage.Tracks != null && if(opticalImage.Tracks != null &&
opticalImage.Tracks.Count > 0) opticalImage.Tracks.Count > 0)
{ {
AaruConsole.WriteLine("Image tracks:"); table = new Table
{
Title = new TableTitle("Image tracks")
};
AaruConsole.WriteLine("{0,-7}{1,-17}{2,-6}{3,-8}{4,-12}{5,-8}{6,-12}{7,-12}", "Track", "Type", table.AddColumn("Track");
"Bps", "Raw bps", "Subchannel", "Pregap", "Start", "End"); table.AddColumn("Type");
table.AddColumn("Bps");
AaruConsole. table.AddColumn("Raw bps");
WriteLine("================================================================================="); table.AddColumn("Subchannel");
table.AddColumn("Pregap");
table.AddColumn("Start");
table.AddColumn("End");
foreach(Track track in opticalImage.Tracks) foreach(Track track in opticalImage.Tracks)
AaruConsole.WriteLine("{0,-7}{1,-17}{2,-6}{3,-8}{4,-12}{5,-8}{6,-12}{7,-12}", table.AddRow(track.TrackSequence.ToString(), track.TrackType.ToString(),
track.TrackSequence, track.TrackType, track.TrackBytesPerSector, track.TrackBytesPerSector.ToString(), track.TrackRawBytesPerSector.ToString(),
track.TrackRawBytesPerSector, track.TrackSubchannelType, track.TrackSubchannelType.ToString(), track.TrackPregap.ToString(),
track.TrackPregap, track.TrackStartSector, track.TrackEndSector); track.TrackStartSector.ToString(), track.TrackEndSector.ToString());
AnsiConsole.Render(table);
if(opticalImage.Tracks.Any(t => t.Indexes.Any())) if(opticalImage.Tracks.Any(t => t.Indexes.Any()))
{ {
AaruConsole.WriteLine(); AaruConsole.WriteLine();
AaruConsole.WriteLine("Track indexes:"); table = new Table
{
Title = new TableTitle("Image indexes")
};
AaruConsole.WriteLine("{0,-7}{1,-7}{2,-12}", "Track", "Index", "Start"); table.AddColumn("Track");
table.AddColumn("Index");
AaruConsole.WriteLine("======================="); table.AddColumn("Start");
foreach(Track track in opticalImage.Tracks) foreach(Track track in opticalImage.Tracks)
foreach(KeyValuePair<ushort, int> index in track.Indexes) foreach(KeyValuePair<ushort, int> index in track.Indexes)
AaruConsole.WriteLine("{0,-7}{1,-7}{2,-12}", track.TrackSequence, index.Key, table.AddRow(track.TrackSequence.ToString(), index.Key.ToString(),
index.Value); index.Value.ToString());
AnsiConsole.Render(table);
} }
} }
} }
@@ -709,37 +744,27 @@ namespace Aaru.Core
} }
} }
manufacturerLen += 2; table = new Table
modelLen += 2; {
serialLen += 2; Title = new TableTitle("Dump hardware information")
softwareLen += 2; };
versionLen += 2;
osLen += 2;
sectorLen += 2;
sectorLen += 2;
char[] separator = new char[manufacturerLen + modelLen + serialLen + softwareLen + versionLen + osLen + table.AddColumn(MANUFACTURER_STRING);
sectorLen + sectorLen]; table.AddColumn(MODEL_STRING);
table.AddColumn(SERIAL_STRING);
for(int i = 0; i < separator.Length; i++) table.AddColumn(SOFTWARE_STRING);
separator[i] = '='; table.AddColumn(VERSION_STRING);
table.AddColumn(OS_STRING);
string format = table.AddColumn(START_STRING);
$"{{0,-{manufacturerLen}}}{{1,-{modelLen}}}{{2,-{serialLen}}}{{3,-{softwareLen}}}{{4,-{versionLen}}}{{5,-{osLen}}}{{6,-{sectorLen}}}{{7,-{sectorLen}}}"; table.AddColumn(END_STRING);
AaruConsole.WriteLine("Dump hardware information:");
AaruConsole.WriteLine(format, MANUFACTURER_STRING, MODEL_STRING, SERIAL_STRING, SOFTWARE_STRING,
VERSION_STRING, OS_STRING, START_STRING, END_STRING);
AaruConsole.WriteLine(new string(separator));
foreach(DumpHardwareType dump in imageFormat.DumpHardware) foreach(DumpHardwareType dump in imageFormat.DumpHardware)
{ {
foreach(ExtentType extent in dump.Extents) foreach(ExtentType extent in dump.Extents)
AaruConsole.WriteLine(format, dump.Manufacturer, dump.Model, dump.Serial, dump.Software.Name, table.AddRow(Markup.Escape(dump.Manufacturer), Markup.Escape(dump.Model),
dump.Software.Version, dump.Software.OperatingSystem, extent.Start, Markup.Escape(dump.Serial), Markup.Escape(dump.Software.Name),
extent.End); Markup.Escape(dump.Software.Version), Markup.Escape(dump.Software.OperatingSystem),
extent.Start.ToString(), extent.End.ToString());
} }
AaruConsole.WriteLine(); AaruConsole.WriteLine();

View File

@@ -38,6 +38,7 @@ using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
using Aaru.Console; using Aaru.Console;
using Aaru.Core; using Aaru.Core;
using Spectre.Console;
namespace Aaru.Commands.Image namespace Aaru.Commands.Image
{ {
@@ -61,10 +62,29 @@ namespace Aaru.Commands.Image
MainClass.PrintCopyright(); MainClass.PrintCopyright();
if(debug) if(debug)
AaruConsole.DebugWriteLineEvent += System.Console.Error.WriteLine; {
IAnsiConsole stderrConsole = AnsiConsole.Create(new AnsiConsoleSettings
{
Out = new AnsiConsoleOutput(System.Console.Error)
});
AaruConsole.DebugWriteLineEvent += (format, objects) =>
{
if(objects is null)
stderrConsole.MarkupLine(format);
else
stderrConsole.MarkupLine(format, objects);
};
}
if(verbose) if(verbose)
AaruConsole.VerboseWriteLineEvent += System.Console.WriteLine; AaruConsole.WriteEvent += (format, objects) =>
{
if(objects is null)
AnsiConsole.Markup(format);
else
AnsiConsole.Markup(format, objects);
};
Statistics.AddCommand("image-info"); Statistics.AddCommand("image-info");
@@ -73,7 +93,13 @@ namespace Aaru.Commands.Image
AaruConsole.DebugWriteLine("Image-info command", "--verbose={0}", verbose); AaruConsole.DebugWriteLine("Image-info command", "--verbose={0}", verbose);
var filtersList = new FiltersList(); var filtersList = new FiltersList();
IFilter inputFilter = filtersList.GetFilter(imagePath); IFilter inputFilter = null;
Core.Spectre.ProgressSingleSpinner(ctx =>
{
ctx.AddTask("Identifying file filter...").IsIndeterminate();
inputFilter = filtersList.GetFilter(imagePath);
});
if(inputFilter == null) if(inputFilter == null)
{ {
@@ -84,7 +110,13 @@ namespace Aaru.Commands.Image
try try
{ {
IMediaImage imageFormat = ImageFormat.Detect(inputFilter); IMediaImage imageFormat = null;
Core.Spectre.ProgressSingleSpinner(ctx =>
{
ctx.AddTask("Identifying image format...").IsIndeterminate();
imageFormat = ImageFormat.Detect(inputFilter);
});
if(imageFormat == null) if(imageFormat == null)
{ {
@@ -98,7 +130,15 @@ namespace Aaru.Commands.Image
try try
{ {
if(!imageFormat.Open(inputFilter)) bool opened = false;
Core.Spectre.ProgressSingleSpinner(ctx =>
{
ctx.AddTask("Opening image file...").IsIndeterminate();
opened = imageFormat.Open(inputFilter);
});
if(!opened)
{ {
AaruConsole.WriteLine("Unable to open image format"); AaruConsole.WriteLine("Unable to open image format");
AaruConsole.WriteLine("No error given"); AaruConsole.WriteLine("No error given");