mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 11:14:25 +00:00
1629 lines
86 KiB
C#
1629 lines
86 KiB
C#
// /***************************************************************************
|
|
// Aaru Data Preservation Suite
|
|
// ----------------------------------------------------------------------------
|
|
//
|
|
// Filename : Headers.cs
|
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
|
//
|
|
// Component : Device structures decoders.
|
|
//
|
|
// --[ Description ] ----------------------------------------------------------
|
|
//
|
|
// Prettifies SCSI MODE headers.
|
|
//
|
|
// --[ License ] --------------------------------------------------------------
|
|
//
|
|
// This library is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as
|
|
// published by the Free Software Foundation; either version 2.1 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This library is distributed in the hope that it will be useful, but
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
// ----------------------------------------------------------------------------
|
|
// Copyright © 2011-2025 Natalia Portillo
|
|
// ****************************************************************************/
|
|
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Text;
|
|
using Aaru.CommonTypes.Structs.Devices.SCSI;
|
|
|
|
namespace Aaru.Decoders.SCSI;
|
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
|
public static partial class Modes
|
|
{
|
|
public static string GetMediumTypeDescription(MediumTypes type) => type switch
|
|
{
|
|
MediumTypes.ECMA54 => Localization
|
|
.GetMediumTypeDescription_ECMA_54,
|
|
MediumTypes.ECMA59 => Localization
|
|
.GetMediumTypeDescription_ECMA_59,
|
|
MediumTypes.ECMA69 => Localization
|
|
.GetMediumTypeDescription_ECMA_69,
|
|
MediumTypes.ECMA66 => Localization
|
|
.GetMediumTypeDescription_ECMA_66,
|
|
MediumTypes.ECMA70 => Localization
|
|
.GetMediumTypeDescription_ECMA_70,
|
|
MediumTypes.ECMA78 => Localization
|
|
.GetMediumTypeDescription_ECMA_78,
|
|
MediumTypes.ECMA99 => Localization
|
|
.GetMediumTypeDescription_ECMA_99,
|
|
MediumTypes.ECMA100 => Localization
|
|
.GetMediumTypeDescription_ECMA_100,
|
|
|
|
// Most probably they will never appear, but magneto-opticals use these codes
|
|
/*
|
|
case MediumTypes.Unspecified_SS:
|
|
return "Unspecified single sided flexible disk";
|
|
case MediumTypes.Unspecified_DS:
|
|
return "Unspecified double sided flexible disk";
|
|
*/
|
|
MediumTypes.X3_73 => Localization
|
|
.GetMediumTypeDescription_X3_73,
|
|
MediumTypes.X3_73_DS => Localization
|
|
.GetMediumTypeDescription_X3_73_DS,
|
|
MediumTypes.X3_82 => Localization
|
|
.GetMediumTypeDescription_X3_82,
|
|
MediumTypes.Type3Floppy => Localization
|
|
.GetMediumTypeDescription_Type3Floppy,
|
|
MediumTypes.HDFloppy => Localization
|
|
.GetMediumTypeDescription_HDFloppy,
|
|
MediumTypes.ReadOnly => Localization
|
|
.GetMediumTypeDescription_ReadOnly,
|
|
MediumTypes.WORM => Localization
|
|
.GetMediumTypeDescription_WORM,
|
|
MediumTypes.Erasable => Localization
|
|
.GetMediumTypeDescription_Erasable,
|
|
MediumTypes.RO_WORM => Localization
|
|
.GetMediumTypeDescription_RO_WORM,
|
|
|
|
// These magneto-opticals were never manufactured
|
|
/*
|
|
case MediumTypes.RO_RW:
|
|
return "a combination of read-only and erasable optical";
|
|
break;
|
|
case MediumTypes.WORM_RW:
|
|
return "a combination of write-once and erasable optical";
|
|
*/
|
|
MediumTypes.DOW => Localization
|
|
.GetMediumTypeDescription_DOW,
|
|
MediumTypes.HiMD => Localization
|
|
.GetMediumTypeDescription_HiMD,
|
|
_ => string.Format(Localization
|
|
.Unknown_medium_type_0,
|
|
(byte)type)
|
|
};
|
|
|
|
public static string PrettifyModeHeader(ModeHeader? header, PeripheralDeviceTypes deviceType)
|
|
{
|
|
if(!header.HasValue) return null;
|
|
|
|
var sb = new StringBuilder();
|
|
|
|
sb.AppendLine($"[bold][blue]{Localization.SCSI_Mode_Sense_Header}[/][/]");
|
|
|
|
switch(deviceType)
|
|
{
|
|
#region Direct access device mode header
|
|
|
|
case PeripheralDeviceTypes.DirectAccess:
|
|
{
|
|
if(header.Value.MediumType != MediumTypes.Default)
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{Localization.Medium_is_0}[/]",
|
|
$"[italic][fuchsia]{GetMediumTypeDescription(header.Value.MediumType)}[/][/]")
|
|
.AppendLine();
|
|
}
|
|
|
|
if(header.Value.WriteProtected) sb.AppendLine($"\t[red]{Localization.Medium_is_write_protected}[/]");
|
|
|
|
if(header.Value.DPOFUA) sb.AppendLine($"\t[green]{Localization.Drive_supports_DPO_and_FUA_bits}[/]");
|
|
|
|
if(header.Value.BlockDescriptors != null)
|
|
{
|
|
foreach(BlockDescriptor descriptor in header.Value.BlockDescriptors)
|
|
{
|
|
var density = "";
|
|
|
|
switch(descriptor.Density)
|
|
{
|
|
case DensityType.Default:
|
|
break;
|
|
case DensityType.Flux7958:
|
|
density = Localization._7958_ftprad;
|
|
|
|
break;
|
|
case DensityType.Flux13262:
|
|
density = Localization._13262_ftprad;
|
|
|
|
break;
|
|
case DensityType.Flux15916:
|
|
density = Localization._15916_ftprad;
|
|
|
|
break;
|
|
default:
|
|
density = string.Format(Localization.with_unknown_density_code_0,
|
|
(byte)descriptor.Density);
|
|
|
|
break;
|
|
}
|
|
|
|
if(density != "")
|
|
{
|
|
if(descriptor.Blocks == 0)
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization.All_remaining_blocks_have_0_and_are_1_bytes_each}[/]",
|
|
$"[lime]{density}[/]",
|
|
$"[lime]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization._0_blocks_have_1_and_are_2_bytes_each}[/]",
|
|
$"[lime]{descriptor.Blocks}[/]",
|
|
$"[lime]{density}[/]",
|
|
$"[lime{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
else if(descriptor.Blocks == 0)
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{Localization.All_remaining_blocks_are_0_bytes_each}[/]",
|
|
$"[lime]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{Localization._0_blocks_are_1_bytes_each}[/]",
|
|
$"[lime]{descriptor.Blocks}[/]",
|
|
$"[lime]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
#endregion Direct access device mode header
|
|
|
|
#region Sequential access device mode header
|
|
|
|
case PeripheralDeviceTypes.SequentialAccess:
|
|
{
|
|
switch(header.Value.BufferedMode)
|
|
{
|
|
case 0:
|
|
sb.AppendLine($"\t[olive]{Localization.Device_writes_directly_to_media}[/]");
|
|
|
|
break;
|
|
case 1:
|
|
sb.AppendLine($"\t[green]{Localization.Device_uses_a_write_cache}[/]");
|
|
|
|
break;
|
|
case 2:
|
|
sb.AppendLine($"\t[green]{
|
|
Localization.Device_uses_a_write_cache_but_doesn_t_return_until_cache_is_flushed}[/]");
|
|
|
|
break;
|
|
default:
|
|
sb.AppendFormat($"\t[green]{Localization.Unknown_buffered_mode_code_0}[/]",
|
|
$"[teal]{header.Value.BufferedMode}[/]")
|
|
.AppendLine();
|
|
|
|
break;
|
|
}
|
|
|
|
if(header.Value.Speed == 0)
|
|
sb.AppendLine($"\t[green]{Localization.Device_uses_default_speed}[/]");
|
|
else
|
|
sb.AppendFormat($"\t[green]{Localization.Device_uses_speed_0}[/]", $"[teal]{header.Value.Speed}[/]")
|
|
.AppendLine();
|
|
|
|
if(header.Value.WriteProtected) sb.AppendLine($"\t[red]{Localization.Medium_is_write_protected}[/]");
|
|
|
|
string medium = header.Value.MediumType switch
|
|
{
|
|
MediumTypes.Default => Localization.MediumType_undefined,
|
|
MediumTypes.Tape12 => Localization.MediumType_Tape12,
|
|
MediumTypes.Tape24 => Localization.MediumType_Tape24,
|
|
MediumTypes.LTOWORM => Localization.MediumType_LTOWORM,
|
|
MediumTypes.LTO => Localization.MediumType_LTO,
|
|
MediumTypes.LTO2 => Localization.MediumType_LTO2,
|
|
MediumTypes.DC2900SL => Localization.MediumType_DC2900SL,
|
|
MediumTypes.MLR1 => Localization.MediumType_MLR1,
|
|
MediumTypes.DC9200 => Localization.MediumType_DC9200,
|
|
MediumTypes.DAT72 => Localization.MediumType_DAT72,
|
|
MediumTypes.LTO3 => Localization.MediumType_LTO3,
|
|
MediumTypes.LTO3WORM => Localization.MediumType_LTO3WORM,
|
|
MediumTypes.DDSCleaning => Localization.MediumType_DDSCleaning,
|
|
MediumTypes.SLR32 => Localization.MediumType_SLR32,
|
|
MediumTypes.SLRtape50 => Localization.MediumType_SLRtape50,
|
|
MediumTypes.LTO4 => Localization.MediumType_LTO4,
|
|
MediumTypes.LTO4WORM => Localization.MediumType_LTO4WORM,
|
|
MediumTypes.SLRtape50SL => Localization.MediumType_SLRtape50SL,
|
|
MediumTypes.SLR32SL => Localization.MediumType_SLR32SL,
|
|
MediumTypes.SLR5 => Localization.MediumType_SLR5,
|
|
MediumTypes.SLR5SL => Localization.MediumType_SLR5SL,
|
|
MediumTypes.LTO5 => Localization.MediumType_LTO5,
|
|
MediumTypes.LTO5WORM => Localization.MediumType_LTO5WORM,
|
|
MediumTypes.SLRtape7 => Localization.MediumType_SLRtape7,
|
|
MediumTypes.SLRtape7SL => Localization.MediumType_SLRtape7SL,
|
|
MediumTypes.SLRtape24 => Localization.MediumType_SLRtape24,
|
|
MediumTypes.SLRtape24SL => Localization.MediumType_SLRtape24SL,
|
|
MediumTypes.LTO6 => Localization.MediumType_LTO6,
|
|
MediumTypes.LTO6WORM => Localization.MediumType_LTO6WORM,
|
|
MediumTypes.SLRtape140 => Localization.MediumType_SLRtape140,
|
|
MediumTypes.SLRtape40 => Localization.MediumType_SLRtape40,
|
|
MediumTypes.SLRtape60 => Localization.MediumType_SLRtape60,
|
|
MediumTypes.SLRtape100 => Localization.MediumType_SLRtape100,
|
|
MediumTypes.SLR40_60_100 => Localization.MediumType_SLR40_60_100,
|
|
MediumTypes.LTO7 => Localization.MediumType_LTO7,
|
|
MediumTypes.LTO7WORM => Localization.MediumType_LTO7WORM,
|
|
MediumTypes.LTOCD => Localization.MediumType_LTO,
|
|
MediumTypes.Exatape15m => Localization.MediumType_Exatape15m,
|
|
MediumTypes.CT1 => Localization.MediumType_CT1,
|
|
MediumTypes.Exatape54m => Localization.MediumType_Exatape54m,
|
|
MediumTypes.Exatape80m => Localization.MediumType_Exatape80m,
|
|
MediumTypes.Exatape106m => Localization.MediumType_Exatape106m,
|
|
MediumTypes.Exatape106mXL => Localization.MediumType_Exatape106mXL,
|
|
MediumTypes.SDLT2 => Localization.MediumType_SDLT2,
|
|
MediumTypes.VStapeI => Localization.MediumType_VStapeI,
|
|
MediumTypes.DLTtapeS4 => Localization.MediumType_DLTtapeS4,
|
|
MediumTypes.Travan7 => Localization.MediumType_Travan7,
|
|
MediumTypes.Exatape22m => Localization.MediumType_Exatape22m,
|
|
MediumTypes.Exatape40m => Localization.MediumType_Exatape40m,
|
|
MediumTypes.Exatape76m => Localization.MediumType_Exatape76m,
|
|
MediumTypes.Exatape112m => Localization.MediumType_Exatape112m,
|
|
MediumTypes.Exatape22mAME => Localization.MediumType_Exatape22mAME,
|
|
MediumTypes.Exatape170m => Localization.MediumType_Exatape170m,
|
|
MediumTypes.Exatape125m => Localization.MediumType_Exatape125m,
|
|
MediumTypes.Exatape45m => Localization.MediumType_Exatape45m,
|
|
MediumTypes.Exatape225m => Localization.MediumType_Exatape225m,
|
|
MediumTypes.Exatape150m => Localization.MediumType_Exatape150m,
|
|
MediumTypes.Exatape75m => Localization.MediumType_Exatape75m,
|
|
_ => string.Format(Localization.Unknown_medium_type_0,
|
|
(byte)header.Value.MediumType)
|
|
};
|
|
|
|
sb.AppendFormat($"\t[slateblue1]{Localization.Medium_is_0}[/]", $"[fuchsia]{medium}[/]").AppendLine();
|
|
|
|
if(header.Value.BlockDescriptors != null)
|
|
{
|
|
foreach(BlockDescriptor descriptor in header.Value.BlockDescriptors)
|
|
{
|
|
var density = "";
|
|
|
|
switch(header.Value.MediumType)
|
|
{
|
|
case MediumTypes.Default:
|
|
{
|
|
switch(descriptor.Density)
|
|
{
|
|
case DensityType.Default:
|
|
break;
|
|
case DensityType.ECMA62:
|
|
density = Localization.ECMA62;
|
|
|
|
break;
|
|
case DensityType.ECMA62_Phase:
|
|
density = Localization.ECMA62_Phase;
|
|
|
|
break;
|
|
case DensityType.ECMA62_GCR:
|
|
density = Localization.ECMA62_GCR;
|
|
|
|
break;
|
|
case DensityType.ECMA79:
|
|
density = Localization.ECMA79;
|
|
|
|
break;
|
|
case DensityType.IBM3480:
|
|
density = Localization.IBM3480;
|
|
|
|
break;
|
|
case DensityType.ECMA46:
|
|
density = Localization.ECMA46;
|
|
|
|
break;
|
|
case DensityType.ECMA98:
|
|
density = Localization.ECMA98;
|
|
|
|
break;
|
|
case DensityType.X3_136:
|
|
density = Localization.X3_136;
|
|
|
|
break;
|
|
case DensityType.X3_157:
|
|
density = Localization.X3_157;
|
|
|
|
break;
|
|
case DensityType.X3_158:
|
|
density = Localization.X3_158;
|
|
|
|
break;
|
|
case DensityType.X3B5_86:
|
|
density = Localization.X3B5_86;
|
|
|
|
break;
|
|
case DensityType.HiTC1:
|
|
density = Localization.HiTC1;
|
|
|
|
break;
|
|
case DensityType.HiTC2:
|
|
density = Localization.HiTC2;
|
|
|
|
break;
|
|
case DensityType.QIC120:
|
|
density = Localization.QIC120;
|
|
|
|
break;
|
|
case DensityType.QIC150:
|
|
density = Localization.QIC150;
|
|
|
|
break;
|
|
case DensityType.QIC320:
|
|
density = Localization.QIC320;
|
|
|
|
break;
|
|
case DensityType.QIC1350:
|
|
density = Localization.QIC1350;
|
|
|
|
break;
|
|
case DensityType.X3B5_88:
|
|
density = Localization.X3B5_88;
|
|
|
|
break;
|
|
case DensityType.X3_202:
|
|
density = Localization.X3_202;
|
|
|
|
break;
|
|
case DensityType.ECMA_TC17:
|
|
density = Localization.ECMA_TC17;
|
|
|
|
break;
|
|
case DensityType.X3_193:
|
|
density = Localization.X3_193;
|
|
|
|
break;
|
|
case DensityType.X3B5_91:
|
|
density = Localization.X3B5_91;
|
|
|
|
break;
|
|
case DensityType.QIC11:
|
|
density = Localization.QIC11;
|
|
|
|
break;
|
|
case DensityType.IBM3490E:
|
|
density = Localization.IBM3490E;
|
|
|
|
break;
|
|
case DensityType.LTO1:
|
|
//case DensityType.SAIT1:
|
|
density = Localization.LTO_or_SAIT1;
|
|
|
|
break;
|
|
case DensityType.LTO2Old:
|
|
density = Localization.MediumType_LTO2;
|
|
|
|
break;
|
|
case DensityType.LTO2:
|
|
//case DensityType.T9840:
|
|
density = Localization.LTO2_or_T9840;
|
|
|
|
break;
|
|
case DensityType.T9940:
|
|
density = Localization.T9940;
|
|
|
|
break;
|
|
case DensityType.LTO3:
|
|
//case DensityType.T9940:
|
|
density = Localization.LTO3_or_T9940;
|
|
|
|
break;
|
|
case DensityType.T9840C:
|
|
density = Localization.T9840C;
|
|
|
|
break;
|
|
case DensityType.LTO4:
|
|
//case DensityType.T9840D:
|
|
density = Localization.LTO4_or_T9840D;
|
|
|
|
break;
|
|
case DensityType.T10000A:
|
|
density = Localization.T10000A;
|
|
|
|
break;
|
|
case DensityType.T10000B:
|
|
density = Localization.T10000B;
|
|
|
|
break;
|
|
case DensityType.T10000C:
|
|
density = Localization.T10000C;
|
|
|
|
break;
|
|
case DensityType.T10000D:
|
|
density = Localization.T10000D;
|
|
|
|
break;
|
|
case DensityType.AIT1:
|
|
density = Localization.AIT1;
|
|
|
|
break;
|
|
case DensityType.AIT2:
|
|
density = Localization.AIT2;
|
|
|
|
break;
|
|
case DensityType.AIT3:
|
|
density = Localization.AIT3;
|
|
|
|
break;
|
|
case DensityType.DDS2:
|
|
density = Localization.DDS2;
|
|
|
|
break;
|
|
case DensityType.DDS3:
|
|
density = Localization.DDS3;
|
|
|
|
break;
|
|
case DensityType.DDS4:
|
|
density = Localization.DDS4;
|
|
|
|
break;
|
|
default:
|
|
density = string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density);
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.LTOWORM:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.LTO_Ultrium_cleaning_cartridge,
|
|
DensityType.LTO3 => Localization.MediumType_LTO3WORM,
|
|
DensityType.LTO4 => Localization.MediumType_LTO4WORM,
|
|
DensityType.LTO5 => Localization.MediumType_LTO5WORM,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.LTO:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.LTO1 => Localization.MediumType_LTO,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.LTO2:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.LTO2 => Localization.MediumType_LTO2,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.DDS3:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MLR1_26GB,
|
|
DensityType.DDS3 => Localization.DDS3,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.DDS4:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.DC9200,
|
|
DensityType.DDS4 => Localization.DDS4,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.DAT72:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.DAT72 => Localization.MediumType_DAT72,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.LTO3:
|
|
case MediumTypes.LTO3WORM:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.LTO3 => Localization.MediumType_LTO3,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.DDSCleaning:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_DDSCleaning,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.LTO4:
|
|
case MediumTypes.LTO4WORM:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.LTO4 => Localization.MediumType_LTO4,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.LTO5:
|
|
case MediumTypes.LTO5WORM:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.LTO5 => Localization.MediumType_LTO5,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.LTO6:
|
|
case MediumTypes.LTO6WORM:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.LTO6 => Localization.MediumType_LTO6,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.LTO7:
|
|
case MediumTypes.LTO7WORM:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.LTO7 => Localization.MediumType_LTO7,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.LTOCD:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.LTO2 => Localization.LTO2_CDemu,
|
|
DensityType.LTO3 => Localization.LTO3_CDemu,
|
|
DensityType.LTO4 => Localization.LTO4_CDemu,
|
|
DensityType.LTO5 => Localization.LTO5_CDemu,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.Exatape15m:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Ex8200 => Localization.EXB8200,
|
|
DensityType.Ex8200c => Localization.EXB8200_compressed,
|
|
DensityType.Ex8500 => Localization.EXB8500,
|
|
DensityType.Ex8500c => Localization.EXB8500_compressed,
|
|
DensityType.Mammoth => Localization.TapeName_Mammoth,
|
|
DensityType.IBM3590 => Localization.IBM3590,
|
|
DensityType.IBM3590E => Localization.IBM3590E,
|
|
DensityType.VXA1 => Localization.VXA1,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.Exatape28m:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Ex8200 => Localization.EXB8200,
|
|
DensityType.Ex8200c => Localization.EXB8200_compressed,
|
|
DensityType.Ex8500 => Localization.EXB8500,
|
|
DensityType.Ex8500c => Localization.EXB8500_compressed,
|
|
DensityType.Mammoth => Localization.TapeName_Mammoth,
|
|
DensityType.CT1 => Localization.CT1,
|
|
DensityType.CT2 => Localization.CT2,
|
|
DensityType.IBM3590 => Localization.IBM3590_extended,
|
|
DensityType.IBM3590E => Localization.IBM3590E_extended,
|
|
DensityType.VXA2 => Localization.VXA2,
|
|
DensityType.VXA3 => Localization.VXA3,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.Exatape54m:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Ex8200 => Localization.EXB8200,
|
|
DensityType.Ex8200c => Localization.EXB8200_compressed,
|
|
DensityType.Ex8500 => Localization.EXB8500,
|
|
DensityType.Ex8500c => Localization.EXB8500_compressed,
|
|
DensityType.Mammoth => Localization.TapeName_Mammoth,
|
|
DensityType.DLT3_42k => Localization.DLT3_42k,
|
|
DensityType.DLT3_56t => Localization.DLT3_56t,
|
|
DensityType.DLT3_62k or DensityType.DLT3_62kAlt => Localization.DLT3_62k,
|
|
DensityType.DLT3c => Localization.DLT3c,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.Exatape80m:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Ex8200 => Localization.EXB8200,
|
|
DensityType.Ex8200c => Localization.EXB8200_compressed,
|
|
DensityType.Ex8500 => Localization.EXB8500,
|
|
DensityType.Ex8500c => Localization.EXB8500_compressed,
|
|
DensityType.Mammoth => Localization.TapeName_Mammoth,
|
|
DensityType.DLT3_62k or DensityType.DLT3_62kAlt => Localization.DLT3_XT,
|
|
DensityType.DLT3c => Localization.DLT3_XT_compressed,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.Exatape106m:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Ex8200 => Localization.EXB8200,
|
|
DensityType.Ex8200c => Localization.EXB8200_compressed,
|
|
DensityType.Ex8500 => Localization.EXB8500,
|
|
DensityType.Ex8500c => Localization.EXB8500_compressed,
|
|
DensityType.Mammoth => Localization.TapeName_Mammoth,
|
|
DensityType.DLT4 or DensityType.DLT4Alt => Localization.DLT4,
|
|
DensityType.DLT4_123k or DensityType.DLT4_123kAlt => Localization
|
|
.DLT4_123k,
|
|
DensityType.DLT4_98k => Localization.DLT4_98k,
|
|
DensityType.Travan5 => Localization.Travan5,
|
|
DensityType.DLT4c => Localization.DLT4c,
|
|
DensityType.DLT4_85k => Localization.DLT4_85k,
|
|
DensityType.DLT4c_85k => Localization.DLT4c_85k,
|
|
DensityType.DLT4c_123k => Localization.DLT4c_123k,
|
|
DensityType.DLT4c_98k => Localization.DLT4c_98k,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.Exatape106mXL:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Ex8200 => Localization.EXB8200,
|
|
DensityType.Ex8200c => Localization.EXB8200_compressed,
|
|
DensityType.Ex8500 => Localization.EXB8500,
|
|
DensityType.Ex8500c => Localization.EXB8500_compressed,
|
|
DensityType.Mammoth => Localization.TapeName_Mammoth,
|
|
DensityType.SDLT1_133k or DensityType.SDLT1_133kAlt => Localization
|
|
.SDLT1_133k,
|
|
DensityType.SDLT1 =>
|
|
|
|
//case DensityType.SDLT1Alt:
|
|
Localization.SDLT1,
|
|
DensityType.SDLT1c => Localization.SDLT1c,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SDLT2:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.SDLT2 => Localization.MediumType_SDLT2,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.VStapeI:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.VStape1 or DensityType.VStape1Alt => Localization
|
|
.MediumType_VStapeI,
|
|
DensityType.VStape1c => Localization.VStape1c,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.DLTtapeS4:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.DLTS4 => Localization.MediumType_DLTtapeS4,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.Exatape22m:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Ex8200 => Localization.EXB8200,
|
|
DensityType.Ex8200c => Localization.EXB8200_compressed,
|
|
DensityType.Ex8500 => Localization.EXB8500,
|
|
DensityType.Ex8500c => Localization.EXB8500_compressed,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.Exatape40m:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Ex8200 => Localization.EXB8200,
|
|
DensityType.Ex8200c => Localization.EXB8200_compressed,
|
|
DensityType.Ex8500 => Localization.EXB8500,
|
|
DensityType.Ex8500c => Localization.EXB8500_compressed,
|
|
DensityType.Mammoth => Localization.TapeName_Mammoth,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.Exatape76m:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Ex8200 => Localization.EXB8200,
|
|
DensityType.Ex8200c => Localization.EXB8200_compressed,
|
|
DensityType.Ex8500 => Localization.EXB8500,
|
|
DensityType.Ex8500c => Localization.EXB8500_compressed,
|
|
DensityType.Mammoth => Localization.TapeName_Mammoth,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.Exatape112m:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Ex8200 => Localization.EXB8200,
|
|
DensityType.Ex8200c => Localization.EXB8200_compressed,
|
|
DensityType.Ex8500 => Localization.EXB8500,
|
|
DensityType.Ex8500c => Localization.EXB8500_compressed,
|
|
DensityType.Mammoth => Localization.TapeName_Mammoth,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.Exatape22mAME:
|
|
case MediumTypes.Exatape170m:
|
|
case MediumTypes.Exatape125m:
|
|
case MediumTypes.Exatape45m:
|
|
case MediumTypes.Exatape225m:
|
|
case MediumTypes.Exatape150m:
|
|
case MediumTypes.Exatape75m:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Mammoth => Localization.TapeName_Mammoth,
|
|
DensityType.Mammoth2 => Localization.Mammoth2,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.DC2900SL:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_DC2900SL,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.DC9250:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.DC9250,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLR32:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLR32,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.MLR1SL:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MLR1_26GBSL,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLRtape50:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLRtape50,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLRtape50SL:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLRtape50SL,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLR32SL:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.SLR32SL,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLR5:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLR5,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLR5SL:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.SLR5SL,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLRtape7:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLRtape7,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLRtape7SL:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLRtape7SL,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLRtape24:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLRtape24,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLRtape24SL:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLRtape24SL,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLRtape140:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLRtape140,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLRtape40:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLRtape40,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLRtape60:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLRtape60,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLRtape100:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.MediumType_SLRtape100,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
case MediumTypes.SLR40_60_100:
|
|
{
|
|
density = descriptor.Density switch
|
|
{
|
|
DensityType.Default => Localization.SLR40_60_100,
|
|
_ => string.Format(Localization.unknown_density_code_0,
|
|
(byte)descriptor.Density)
|
|
};
|
|
}
|
|
|
|
break;
|
|
default:
|
|
density = string.Format(Localization.unknown_density_code_0, (byte)descriptor.Density);
|
|
|
|
break;
|
|
}
|
|
|
|
if(density != "")
|
|
{
|
|
if(descriptor.Blocks == 0)
|
|
{
|
|
if(descriptor.BlockLength == 0)
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{
|
|
Localization
|
|
.All_remaining_blocks_conform_to_0_and_have_a_variable_length}[/]",
|
|
$"[fuchsia]{density}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{
|
|
Localization.All_remaining_blocks_conform_to_0_and_are_1_bytes_each}[/]",
|
|
$"[fuchsia]{density}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
else if(descriptor.BlockLength == 0)
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization._0_blocks_conform_to_1_and_have_a_variable_length}[/]",
|
|
$"[teal]{descriptor.Blocks}[/]",
|
|
$"[fuchsia]{density}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization._0_blocks_conform_to_1_and_are_2_bytes_each}[/]",
|
|
$"[teal]{descriptor.Blocks}[/]",
|
|
$"[fuchsia]{density}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
else if(descriptor.Blocks == 0)
|
|
{
|
|
if(descriptor.BlockLength == 0)
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization.All_remaining_blocks_have_a_variable_length}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization.All_remaining_blocks_are_0_bytes_each}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
else if(descriptor.BlockLength == 0)
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{Localization._0_blocks_have_a_variable_length}[/]",
|
|
$"[teal]{descriptor.Blocks}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{Localization._0_blocks_are_1_bytes_each}[/]",
|
|
$"[teal]{descriptor.Blocks}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
#endregion Sequential access device mode header
|
|
|
|
#region Printer device mode header
|
|
|
|
case PeripheralDeviceTypes.PrinterDevice:
|
|
{
|
|
switch(header.Value.BufferedMode)
|
|
{
|
|
case 0:
|
|
sb.AppendLine($"\t[olive]{Localization.Device_prints_directly}[/]");
|
|
|
|
break;
|
|
case 1:
|
|
sb.AppendLine($"\t[green]{Localization.Device_uses_a_print_cache}[/]");
|
|
|
|
break;
|
|
default:
|
|
sb.AppendFormat($"\t[red]{Localization.Unknown_buffered_mode_code_0}[/]",
|
|
$"[teal]{header.Value.BufferedMode}[/]")
|
|
.AppendLine();
|
|
|
|
break;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
#endregion Printer device mode header
|
|
|
|
#region Optical device mode header
|
|
|
|
case PeripheralDeviceTypes.OpticalDevice:
|
|
{
|
|
if(header.Value.MediumType != MediumTypes.Default)
|
|
{
|
|
sb.Append($"\t[slateblue1]{Localization.Medium_is_}");
|
|
|
|
switch(header.Value.MediumType)
|
|
{
|
|
case MediumTypes.ReadOnly:
|
|
sb.Append(Localization.GetMediumTypeDescription_ReadOnly);
|
|
|
|
break;
|
|
case MediumTypes.WORM:
|
|
sb.Append(Localization.GetMediumTypeDescription_WORM);
|
|
|
|
break;
|
|
case MediumTypes.Erasable:
|
|
sb.Append(Localization.GetMediumTypeDescription_Erasable);
|
|
|
|
break;
|
|
case MediumTypes.RO_WORM:
|
|
sb.Append(Localization.GetMediumTypeDescription_RO_WORM);
|
|
|
|
break;
|
|
case MediumTypes.RO_RW:
|
|
sb.Append(Localization.a_combination_of_read_only_and_erasable_optical);
|
|
|
|
break;
|
|
case MediumTypes.WORM_RW:
|
|
sb.Append(Localization.a_combination_of_write_once_and_erasable_optical);
|
|
|
|
break;
|
|
case MediumTypes.DOW:
|
|
sb.Append(Localization.GetMediumTypeDescription_DOW);
|
|
|
|
break;
|
|
default:
|
|
sb.AppendFormat(Localization.an_unknown_medium_type_0,
|
|
$"[teal]{(byte)header.Value.MediumType}[/]");
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
sb.AppendLine("[/]");
|
|
|
|
if(header.Value.WriteProtected) sb.AppendLine($"\t[red]{Localization.Medium_is_write_protected}[/]");
|
|
|
|
if(header.Value.EBC)
|
|
sb.AppendLine($"\t[green]{Localization.Blank_checking_during_write_is_enabled}[/]");
|
|
|
|
if(header.Value.DPOFUA) sb.AppendLine($"\t[green]{Localization.Drive_supports_DPO_and_FUA_bits}[/]");
|
|
|
|
if(header.Value.BlockDescriptors != null)
|
|
{
|
|
foreach(BlockDescriptor descriptor in header.Value.BlockDescriptors)
|
|
{
|
|
var density = "";
|
|
|
|
switch(descriptor.Density)
|
|
{
|
|
case DensityType.Default:
|
|
break;
|
|
case DensityType.ISO10090:
|
|
density = Localization.ISO10090;
|
|
|
|
break;
|
|
case DensityType.D581:
|
|
density = Localization.D581;
|
|
|
|
break;
|
|
case DensityType.X3_212:
|
|
density = Localization.X3_212;
|
|
|
|
break;
|
|
case DensityType.X3_191:
|
|
density = Localization.X3_191;
|
|
|
|
break;
|
|
case DensityType.X3_214:
|
|
density = Localization.X3_214;
|
|
|
|
break;
|
|
case DensityType.X3_211:
|
|
density = Localization.X3_211;
|
|
|
|
break;
|
|
case DensityType.D407:
|
|
density = Localization.D407;
|
|
|
|
break;
|
|
case DensityType.ISO13614:
|
|
density = Localization.ISO13614;
|
|
|
|
break;
|
|
case DensityType.X3_200:
|
|
density = Localization.X3_200;
|
|
|
|
break;
|
|
default:
|
|
density = string.Format(Localization.unknown_density_code_0, (byte)descriptor.Density);
|
|
|
|
break;
|
|
}
|
|
|
|
if(density != "")
|
|
{
|
|
if(descriptor.Blocks == 0)
|
|
{
|
|
if(descriptor.BlockLength == 0)
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{
|
|
Localization.All_remaining_blocks_are_0_and_have_a_variable_length}[/]",
|
|
$"[fuchsia]{density}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization.All_remaining_blocks_are_0_and_are_1_bytes_each}[/]",
|
|
$"[fuchsia]{density}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
else if(descriptor.BlockLength == 0)
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization._0_blocks_are_1_and_have_a_variable_length}[/]",
|
|
$"[teal]{descriptor.Blocks}[/]",
|
|
$"[fuchsia]{density}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{Localization._0_blocks_are_1_and_are_2_bytes_each}[/]",
|
|
$"[teal]{descriptor.Blocks}[/]",
|
|
$"[fuchsia]{density}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
else if(descriptor.Blocks == 0)
|
|
{
|
|
if(descriptor.BlockLength == 0)
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization.All_remaining_blocks_have_a_variable_length}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization.All_remaining_blocks_are_0_bytes_each}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
else if(descriptor.BlockLength == 0)
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{Localization._0_blocks_have_a_variable_length}[/]",
|
|
$"[teal]{descriptor.Blocks}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{Localization._0_blocks_are_1_bytes_each}[/]",
|
|
$"[teal]{descriptor.Blocks}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
#endregion Optical device mode header
|
|
|
|
#region Multimedia device mode header
|
|
|
|
case PeripheralDeviceTypes.MultiMediaDevice:
|
|
{
|
|
sb.Append($"\t[slateblue1]{Localization.Medium_is_}[fuchsia]");
|
|
|
|
switch(header.Value.MediumType)
|
|
{
|
|
case MediumTypes.CDROM:
|
|
sb.Append(Localization.MediumTypes_CDROM);
|
|
|
|
break;
|
|
case MediumTypes.CDDA:
|
|
sb.Append(Localization.MediumTypes_CDDA);
|
|
|
|
break;
|
|
case MediumTypes.MixedCD:
|
|
sb.Append(Localization.MediumTypes_MixedCD);
|
|
|
|
break;
|
|
case MediumTypes.CDROM_80:
|
|
sb.Append(Localization.MediumTypes_CDROM_80);
|
|
|
|
break;
|
|
case MediumTypes.CDDA_80:
|
|
sb.Append(Localization.MediumTypes_CDDA_80);
|
|
|
|
break;
|
|
case MediumTypes.MixedCD_80:
|
|
sb.Append(Localization.MediumTypes_MixedCD_80);
|
|
|
|
break;
|
|
case MediumTypes.Unknown_CD:
|
|
sb.Append(Localization.Unknown_medium_type);
|
|
|
|
break;
|
|
case MediumTypes.HybridCD:
|
|
sb.Append(Localization.MediumTypes_HybridCD);
|
|
|
|
break;
|
|
case MediumTypes.Unknown_CDR:
|
|
sb.Append(Localization.MediumTypes_Unknown_CDR);
|
|
|
|
break;
|
|
case MediumTypes.CDR:
|
|
sb.Append(Localization.MediumTypes_CDR);
|
|
|
|
break;
|
|
case MediumTypes.CDR_DA:
|
|
sb.Append(Localization.MediumTypes_CDR_DA);
|
|
|
|
break;
|
|
case MediumTypes.CDR_Mixed:
|
|
sb.Append(Localization.MediumTypes_CDR_Mixed);
|
|
|
|
break;
|
|
case MediumTypes.HybridCDR:
|
|
sb.Append(Localization.MediumTypes_HybridCDR);
|
|
|
|
break;
|
|
case MediumTypes.CDR_80:
|
|
sb.Append(Localization.MediumTypes_CDR_80);
|
|
|
|
break;
|
|
case MediumTypes.CDR_DA_80:
|
|
sb.Append(Localization.MediumTypes_CDR_DA_80);
|
|
|
|
break;
|
|
case MediumTypes.CDR_Mixed_80:
|
|
sb.Append(Localization.MediumTypes_CDR_Mixed_80);
|
|
|
|
break;
|
|
case MediumTypes.HybridCDR_80:
|
|
sb.Append(Localization.MediumTypes_HybridCDR_80);
|
|
|
|
break;
|
|
case MediumTypes.Unknown_CDRW:
|
|
sb.Append(Localization.MediumTypes_Unknown_CDRW);
|
|
|
|
break;
|
|
case MediumTypes.CDRW:
|
|
sb.Append(Localization.MediumTypes_CDRW);
|
|
|
|
break;
|
|
case MediumTypes.CDRW_DA:
|
|
sb.Append(Localization.MediumTypes_CDRW_DA);
|
|
|
|
break;
|
|
case MediumTypes.CDRW_Mixed:
|
|
sb.Append(Localization.MediumTypes_CDRW_Mixed);
|
|
|
|
break;
|
|
case MediumTypes.HybridCDRW:
|
|
sb.Append(Localization.MediumTypes_HybridCDRW);
|
|
|
|
break;
|
|
case MediumTypes.CDRW_80:
|
|
sb.Append(Localization.MediumTypes_CDRW_80);
|
|
|
|
break;
|
|
case MediumTypes.CDRW_DA_80:
|
|
sb.Append(Localization.MediumTypes_CDRW_DA_80);
|
|
|
|
break;
|
|
case MediumTypes.CDRW_Mixed_80:
|
|
sb.Append(Localization.MediumTypes_CDRW_Mixed_80);
|
|
|
|
break;
|
|
case MediumTypes.HybridCDRW_80:
|
|
sb.Append(Localization.MediumTypes_HybridCDRW_80);
|
|
|
|
break;
|
|
case MediumTypes.Unknown_HD:
|
|
sb.Append(Localization.MediumTypes_Unknown_HD);
|
|
|
|
break;
|
|
case MediumTypes.HD:
|
|
sb.Append(Localization.MediumTypes_HD);
|
|
|
|
break;
|
|
case MediumTypes.HD_80:
|
|
sb.Append(Localization.MediumTypes_HD_80);
|
|
|
|
break;
|
|
case MediumTypes.NoDisc:
|
|
sb.Append(Localization.No_disc_inserted_tray_closed_or_caddy_inserted);
|
|
|
|
break;
|
|
case MediumTypes.TrayOpen:
|
|
sb.Append(Localization.Tray_open_or_no_caddy_inserted);
|
|
|
|
break;
|
|
case MediumTypes.MediumError:
|
|
sb.Append(Localization.Tray_closed_or_caddy_inserted_but_medium_error);
|
|
|
|
break;
|
|
case MediumTypes.UnknownBlockDevice:
|
|
sb.Append(Localization.Unknown_block_device);
|
|
|
|
break;
|
|
case MediumTypes.ReadOnlyBlockDevice:
|
|
sb.Append(Localization.Read_only_block_device);
|
|
|
|
break;
|
|
case MediumTypes.ReadWriteBlockDevice:
|
|
sb.Append(Localization.Read_Write_block_device);
|
|
|
|
break;
|
|
case MediumTypes.LTOCD:
|
|
sb.Append(Localization.LTO_in_CD_ROM_emulation_mode);
|
|
|
|
break;
|
|
default:
|
|
sb.AppendFormat(Localization.Unknown_medium_type_0,
|
|
$"[teal]{(byte)header.Value.MediumType}[/]");
|
|
|
|
break;
|
|
}
|
|
|
|
sb.AppendLine("[/][/]");
|
|
|
|
if(header.Value.WriteProtected) sb.AppendLine($"\t[red]{Localization.Medium_is_write_protected}[/]");
|
|
|
|
if(header.Value.DPOFUA) sb.AppendLine($"\t[green]{Localization.Drive_supports_DPO_and_FUA_bits}[/]");
|
|
|
|
if(header.Value.BlockDescriptors != null)
|
|
{
|
|
foreach(BlockDescriptor descriptor in header.Value.BlockDescriptors)
|
|
{
|
|
var density = "";
|
|
|
|
switch(descriptor.Density)
|
|
{
|
|
case DensityType.Default:
|
|
break;
|
|
case DensityType.User:
|
|
density = Localization.user_data_only;
|
|
|
|
break;
|
|
case DensityType.UserAuxiliary:
|
|
density = Localization.user_data_plus_auxiliary_data;
|
|
|
|
break;
|
|
case DensityType.UserAuxiliaryTag:
|
|
density = Localization._4byte_tag_user_data_plus_auxiliary_data;
|
|
|
|
break;
|
|
case DensityType.Audio:
|
|
density = Localization.audio_information_only;
|
|
|
|
break;
|
|
case DensityType.LTO2:
|
|
density = Localization.MediumType_LTO2;
|
|
|
|
break;
|
|
case DensityType.LTO3:
|
|
density = Localization.MediumType_LTO3;
|
|
|
|
break;
|
|
case DensityType.LTO4:
|
|
density = Localization.MediumType_LTO4;
|
|
|
|
break;
|
|
case DensityType.LTO5:
|
|
density = Localization.MediumType_LTO5;
|
|
|
|
break;
|
|
default:
|
|
density = string.Format(Localization.with_unknown_density_code_0,
|
|
(byte)descriptor.Density);
|
|
|
|
break;
|
|
}
|
|
|
|
if(density != "")
|
|
{
|
|
if(descriptor.Blocks == 0)
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization.All_remaining_blocks_have_0_and_are_1_bytes_each}[/]",
|
|
$"[fuchsia]{density}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb
|
|
.AppendFormat($"\t[slateblue1]{Localization._0_blocks_have_1_and_are_2_bytes_each}[/]",
|
|
$"[teal]{descriptor.Blocks}[/]",
|
|
$"[fuchsia]{density}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
else if(descriptor.Blocks == 0)
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{Localization.All_remaining_blocks_are_0_bytes_each}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
else
|
|
{
|
|
sb.AppendFormat($"\t[slateblue1]{Localization._0_blocks_are_1_bytes_each}[/]",
|
|
$"[teal]{descriptor.Blocks}[/]",
|
|
$"[teal]{descriptor.BlockLength}[/]")
|
|
.AppendLine();
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
#endregion Multimedia device mode header
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
} |