Add Lisa tags converters and marshallers.

This commit is contained in:
2018-01-04 02:28:47 +00:00
parent 43d7a9debd
commit c3be1733a4

View File

@@ -88,6 +88,79 @@ namespace DiscImageChef.Decoders
public bool IsFirst; public bool IsFirst;
/// <summary>On-memory value for easy last block search.</summary> /// <summary>On-memory value for easy last block search.</summary>
public bool IsLast; public bool IsLast;
/// <summary>
/// Converts this tag to Priam DataTower format
/// </summary>
public PriamTag ToPriam()
{
return new PriamTag
{
AbsPage = AbsPage,
Checksum = Checksum,
FileId = FileId,
IsFirst = IsFirst,
IsLast = IsLast,
Kind = Kind,
NextBlock = IsLast ? 0xFFFFFF : NextBlock & 0xFFFFFF,
PrevBlock = IsFirst ? 0xFFFFFF : PrevBlock & 0xFFFFFF,
RelPage = RelPage,
UsedBytes = UsedBytes,
ValidChk = ValidChk,
Version = Version,
Volume = Volume
};
}
/// <summary>
/// Converts this tag to Sony format
/// </summary>
public SonyTag Sony()
{
return new SonyTag
{
FileId = FileId,
IsFirst = IsFirst,
IsLast = IsLast,
Kind = Kind,
NextBlock = (ushort)NextBlock,
PrevBlock = (ushort)PrevBlock,
RelPage = RelPage,
Version = Version,
Volume = Volume
};
}
/// <summary>
/// Gets a byte array representation of this tag
/// </summary>
public byte[] GetBytes()
{
byte[] tagBytes = new byte[20];
BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian;
byte[] tmp = BigEndianBitConverter.GetBytes(Version);
Array.Copy(tmp, 0, tagBytes, 0, 2);
tagBytes[2] = (byte)(Kind << 6);
tagBytes[3] = Volume;
tmp = BigEndianBitConverter.GetBytes(FileId);
Array.Copy(tmp, 0, tagBytes, 4, 2);
tmp = BigEndianBitConverter.GetBytes((ushort)(UsedBytes & 0x7FFF));
Array.Copy(tmp, 0, tagBytes, 6, 2);
if(ValidChk) tagBytes[6] += 0x80;
tmp = BigEndianBitConverter.GetBytes(AbsPage);
Array.Copy(tmp, 1, tagBytes, 8, 3);
tagBytes[11] = Checksum;
tmp = BigEndianBitConverter.GetBytes(RelPage);
Array.Copy(tmp, 0, tagBytes, 12, 2);
tmp = BigEndianBitConverter.GetBytes(IsLast ? 0xFFFFFF : NextBlock);
Array.Copy(tmp, 1, tagBytes, 14, 3);
tmp = BigEndianBitConverter.GetBytes(IsFirst ? 0xFFFFFF : PrevBlock);
Array.Copy(tmp, 1, tagBytes, 17, 3);
return tagBytes;
}
} }
/// <summary> /// <summary>
@@ -142,6 +215,81 @@ namespace DiscImageChef.Decoders
public bool IsFirst; public bool IsFirst;
/// <summary>On-memory value for easy last block search.</summary> /// <summary>On-memory value for easy last block search.</summary>
public bool IsLast; public bool IsLast;
/// <summary>
/// Converts this tag to Apple Profile format
/// </summary>
public ProfileTag Profile()
{
return new ProfileTag
{
AbsPage = AbsPage,
Checksum = Checksum,
FileId = FileId,
IsFirst = IsFirst,
IsLast = IsLast,
Kind = Kind,
NextBlock = IsLast ? 0xFFFFFF : NextBlock & 0xFFFFFF,
PrevBlock = IsFirst ? 0xFFFFFF : PrevBlock & 0xFFFFFF,
RelPage = RelPage,
UsedBytes = UsedBytes,
ValidChk = ValidChk,
Version = Version,
Volume = Volume
};
}
/// <summary>
/// Converts this tag to Sony format
/// </summary>
public SonyTag ToSony()
{
return new SonyTag
{
FileId = FileId,
IsFirst = IsFirst,
IsLast = IsLast,
Kind = Kind,
NextBlock = (ushort)(IsLast ? 0x7FF : NextBlock & 0x7FF),
PrevBlock = (ushort)(IsFirst ? 0x7FF : PrevBlock & 0x7FF),
RelPage = RelPage,
Version = Version,
Volume = Volume
};
}
/// <summary>
/// Gets a byte array representation of this tag
/// </summary>
public byte[] GetBytes()
{
byte[] tagBytes = new byte[24];
BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian;
byte[] tmp = BigEndianBitConverter.GetBytes(Version);
Array.Copy(tmp, 0, tagBytes, 0, 2);
tagBytes[2] = (byte)(Kind << 6);
tagBytes[3] = Volume;
tmp = BigEndianBitConverter.GetBytes(FileId);
Array.Copy(tmp, 0, tagBytes, 4, 2);
tmp = BigEndianBitConverter.GetBytes((ushort)(UsedBytes & 0x7FFF));
Array.Copy(tmp, 0, tagBytes, 6, 2);
if(ValidChk) tagBytes[6] += 0x80;
tmp = BigEndianBitConverter.GetBytes(AbsPage);
Array.Copy(tmp, 1, tagBytes, 8, 3);
tagBytes[11] = Checksum;
tmp = BigEndianBitConverter.GetBytes(RelPage);
Array.Copy(tmp, 0, tagBytes, 12, 2);
tmp = BigEndianBitConverter.GetBytes(IsLast ? 0xFFFFFF : NextBlock);
Array.Copy(tmp, 1, tagBytes, 14, 3);
tmp = BigEndianBitConverter.GetBytes(IsFirst ? 0xFFFFFF : PrevBlock);
Array.Copy(tmp, 1, tagBytes, 17, 3);
tmp = BigEndianBitConverter.GetBytes(DiskSize);
Array.Copy(tmp, 0, tagBytes, 20, 4);
return tagBytes;
}
} }
/// <summary> /// <summary>
@@ -176,6 +324,69 @@ namespace DiscImageChef.Decoders
public bool IsFirst; public bool IsFirst;
/// <summary>On-memory value for easy last block search.</summary> /// <summary>On-memory value for easy last block search.</summary>
public bool IsLast; public bool IsLast;
/// <summary>
/// Converts this tag to Apple Profile format
/// </summary>
public ProfileTag ToProfile()
{
return new ProfileTag
{
FileId = FileId,
IsFirst = IsFirst,
IsLast = IsLast,
Kind = Kind,
NextBlock = (uint)(IsLast ? 0xFFFFFF : NextBlock & 0xFFFFFF),
PrevBlock = (uint)(IsFirst ? 0xFFFFFF : PrevBlock & 0xFFFFFF),
RelPage = RelPage,
Version = Version,
Volume = Volume
};
}
/// <summary>
/// Converts this tag to Priam DataTower format
/// </summary>
public PriamTag ToPriam()
{
return new PriamTag
{
FileId = FileId,
IsFirst = IsFirst,
IsLast = IsLast,
Kind = Kind,
NextBlock = (uint)(IsLast ? 0xFFFFFF : NextBlock & 0xFFFFFF),
PrevBlock = (uint)(IsFirst ? 0xFFFFFF : PrevBlock & 0xFFFFFF),
RelPage = RelPage,
Version = Version,
Volume = Volume
};
}
/// <summary>
/// Gets a byte array representation of this tag
/// </summary>
public byte[] GetBytes()
{
byte[] tagBytes = new byte[12];
BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian;
byte[] tmp = BigEndianBitConverter.GetBytes(Version);
Array.Copy(tmp, 0, tagBytes, 0, 2);
tagBytes[2] = (byte)(Kind << 6);
tagBytes[3] = Volume;
tmp = BigEndianBitConverter.GetBytes(FileId);
Array.Copy(tmp, 0, tagBytes, 4, 2);
tmp = BigEndianBitConverter.GetBytes(RelPage);
Array.Copy(tmp, 0, tagBytes, 6, 2);
tmp = BigEndianBitConverter.GetBytes(IsLast ? 0x7FF : NextBlock);
Array.Copy(tmp, 1, tagBytes, 8, 2);
tmp = BigEndianBitConverter.GetBytes(IsFirst ? 0x7FF : PrevBlock);
Array.Copy(tmp, 1, tagBytes, 10, 2);
return tagBytes;
}
} }
public static SonyTag? DecodeSonyTag(byte[] tag) public static SonyTag? DecodeSonyTag(byte[] tag)
@@ -186,16 +397,16 @@ namespace DiscImageChef.Decoders
BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian;
snTag.Version = BigEndianBitConverter.ToUInt16(tag, 0); snTag.Version = BigEndianBitConverter.ToUInt16(tag, 0);
snTag.Kind = (byte)((tag[2] & 0xC0) >> 6); snTag.Kind = (byte)((tag[2] & 0xC0) >> 6);
snTag.Reserved = (byte)(tag[2] & 0x3F); snTag.Reserved = (byte)(tag[2] & 0x3F);
snTag.Volume = tag[3]; snTag.Volume = tag[3];
snTag.FileId = BigEndianBitConverter.ToInt16(tag, 4); snTag.FileId = BigEndianBitConverter.ToInt16(tag, 4);
snTag.RelPage = BigEndianBitConverter.ToUInt16(tag, 6); snTag.RelPage = BigEndianBitConverter.ToUInt16(tag, 6);
snTag.NextBlock = (ushort)(BigEndianBitConverter.ToUInt16(tag, 8) & 0x7FF); snTag.NextBlock = (ushort)(BigEndianBitConverter.ToUInt16(tag, 8) & 0x7FF);
snTag.PrevBlock = (ushort)(BigEndianBitConverter.ToUInt16(tag, 10) & 0x7FF); snTag.PrevBlock = (ushort)(BigEndianBitConverter.ToUInt16(tag, 10) & 0x7FF);
snTag.IsLast = snTag.NextBlock == 0x7FF; snTag.IsLast = snTag.NextBlock == 0x7FF;
snTag.IsFirst = snTag.PrevBlock == 0x7FF; snTag.IsFirst = snTag.PrevBlock == 0x7FF;
return snTag; return snTag;
@@ -211,36 +422,36 @@ namespace DiscImageChef.Decoders
byte[] tmp = new byte[4]; byte[] tmp = new byte[4];
phTag.Version = BigEndianBitConverter.ToUInt16(tag, 0); phTag.Version = BigEndianBitConverter.ToUInt16(tag, 0);
phTag.Kind = (byte)((tag[2] & 0xC0) >> 6); phTag.Kind = (byte)((tag[2] & 0xC0) >> 6);
phTag.Reserved = (byte)(tag[2] & 0x3F); phTag.Reserved = (byte)(tag[2] & 0x3F);
phTag.Volume = tag[3]; phTag.Volume = tag[3];
phTag.FileId = BigEndianBitConverter.ToInt16(tag, 4); phTag.FileId = BigEndianBitConverter.ToInt16(tag, 4);
phTag.ValidChk |= (tag[6] & 0x80) == 0x80; phTag.ValidChk |= (tag[6] & 0x80) == 0x80;
phTag.UsedBytes = (ushort)(BigEndianBitConverter.ToUInt16(tag, 6) & 0x7FFF); phTag.UsedBytes = (ushort)(BigEndianBitConverter.ToUInt16(tag, 6) & 0x7FFF);
tmp[0] = 0x00; tmp[0] = 0x00;
tmp[1] = tag[8]; tmp[1] = tag[8];
tmp[2] = tag[9]; tmp[2] = tag[9];
tmp[3] = tag[10]; tmp[3] = tag[10];
phTag.AbsPage = BigEndianBitConverter.ToUInt32(tmp, 0); phTag.AbsPage = BigEndianBitConverter.ToUInt32(tmp, 0);
phTag.Checksum = tag[11]; phTag.Checksum = tag[11];
phTag.RelPage = BigEndianBitConverter.ToUInt16(tag, 12); phTag.RelPage = BigEndianBitConverter.ToUInt16(tag, 12);
tmp[0] = 0x00; tmp[0] = 0x00;
tmp[1] = tag[14]; tmp[1] = tag[14];
tmp[2] = tag[15]; tmp[2] = tag[15];
tmp[3] = tag[16]; tmp[3] = tag[16];
phTag.NextBlock = BigEndianBitConverter.ToUInt32(tmp, 0); phTag.NextBlock = BigEndianBitConverter.ToUInt32(tmp, 0);
tmp[0] = 0x00; tmp[0] = 0x00;
tmp[1] = tag[17]; tmp[1] = tag[17];
tmp[2] = tag[18]; tmp[2] = tag[18];
tmp[3] = tag[19]; tmp[3] = tag[19];
phTag.PrevBlock = BigEndianBitConverter.ToUInt32(tmp, 0); phTag.PrevBlock = BigEndianBitConverter.ToUInt32(tmp, 0);
phTag.IsLast = phTag.NextBlock == 0xFFFFFF; phTag.IsLast = phTag.NextBlock == 0xFFFFFF;
phTag.IsFirst = phTag.PrevBlock == 0xFFFFFF; phTag.IsFirst = phTag.PrevBlock == 0xFFFFFF;
return phTag; return phTag;
@@ -256,38 +467,38 @@ namespace DiscImageChef.Decoders
byte[] tmp = new byte[4]; byte[] tmp = new byte[4];
pmTag.Version = BigEndianBitConverter.ToUInt16(tag, 0); pmTag.Version = BigEndianBitConverter.ToUInt16(tag, 0);
pmTag.Kind = (byte)((tag[2] & 0xC0) >> 6); pmTag.Kind = (byte)((tag[2] & 0xC0) >> 6);
pmTag.Reserved = (byte)(tag[2] & 0x3F); pmTag.Reserved = (byte)(tag[2] & 0x3F);
pmTag.Volume = tag[3]; pmTag.Volume = tag[3];
pmTag.FileId = BigEndianBitConverter.ToInt16(tag, 4); pmTag.FileId = BigEndianBitConverter.ToInt16(tag, 4);
pmTag.ValidChk |= (tag[6] & 0x80) == 0x80; pmTag.ValidChk |= (tag[6] & 0x80) == 0x80;
pmTag.UsedBytes = (ushort)(BigEndianBitConverter.ToUInt16(tag, 6) & 0x7FFF); pmTag.UsedBytes = (ushort)(BigEndianBitConverter.ToUInt16(tag, 6) & 0x7FFF);
tmp[0] = 0x00; tmp[0] = 0x00;
tmp[1] = tag[8]; tmp[1] = tag[8];
tmp[2] = tag[9]; tmp[2] = tag[9];
tmp[3] = tag[10]; tmp[3] = tag[10];
pmTag.AbsPage = BigEndianBitConverter.ToUInt32(tmp, 0); pmTag.AbsPage = BigEndianBitConverter.ToUInt32(tmp, 0);
pmTag.Checksum = tag[11]; pmTag.Checksum = tag[11];
pmTag.RelPage = BigEndianBitConverter.ToUInt16(tag, 12); pmTag.RelPage = BigEndianBitConverter.ToUInt16(tag, 12);
tmp[0] = 0x00; tmp[0] = 0x00;
tmp[1] = tag[14]; tmp[1] = tag[14];
tmp[2] = tag[15]; tmp[2] = tag[15];
tmp[3] = tag[16]; tmp[3] = tag[16];
pmTag.NextBlock = BigEndianBitConverter.ToUInt32(tmp, 0); pmTag.NextBlock = BigEndianBitConverter.ToUInt32(tmp, 0);
tmp[0] = 0x00; tmp[0] = 0x00;
tmp[1] = tag[17]; tmp[1] = tag[17];
tmp[2] = tag[18]; tmp[2] = tag[18];
tmp[3] = tag[19]; tmp[3] = tag[19];
pmTag.PrevBlock = BigEndianBitConverter.ToUInt32(tmp, 0); pmTag.PrevBlock = BigEndianBitConverter.ToUInt32(tmp, 0);
pmTag.DiskSize = BigEndianBitConverter.ToUInt32(tag, 20); pmTag.DiskSize = BigEndianBitConverter.ToUInt32(tag, 20);
pmTag.IsLast = pmTag.NextBlock == 0xFFFFFF; pmTag.IsLast = pmTag.NextBlock == 0xFFFFFF;
pmTag.IsFirst = pmTag.PrevBlock == 0xFFFFFF; pmTag.IsFirst = pmTag.PrevBlock == 0xFFFFFF;
return pmTag; return pmTag;
@@ -306,22 +517,22 @@ namespace DiscImageChef.Decoders
if(snTag == null) return null; if(snTag == null) return null;
pmTag = new PriamTag(); pmTag = new PriamTag();
pmTag.AbsPage = 0; pmTag.AbsPage = 0;
pmTag.Checksum = 0; pmTag.Checksum = 0;
pmTag.DiskSize = 0; pmTag.DiskSize = 0;
pmTag.FileId = snTag.Value.FileId; pmTag.FileId = snTag.Value.FileId;
pmTag.Kind = snTag.Value.Kind; pmTag.Kind = snTag.Value.Kind;
pmTag.NextBlock = snTag.Value.NextBlock; pmTag.NextBlock = snTag.Value.NextBlock;
pmTag.PrevBlock = snTag.Value.PrevBlock; pmTag.PrevBlock = snTag.Value.PrevBlock;
pmTag.RelPage = snTag.Value.RelPage; pmTag.RelPage = snTag.Value.RelPage;
pmTag.Reserved = snTag.Value.Reserved; pmTag.Reserved = snTag.Value.Reserved;
pmTag.UsedBytes = 0; pmTag.UsedBytes = 0;
pmTag.ValidChk = false; pmTag.ValidChk = false;
pmTag.Version = snTag.Value.Version; pmTag.Version = snTag.Value.Version;
pmTag.Volume = snTag.Value.Volume; pmTag.Volume = snTag.Value.Volume;
pmTag.IsFirst = snTag.Value.IsFirst; pmTag.IsFirst = snTag.Value.IsFirst;
pmTag.IsLast = snTag.Value.IsLast; pmTag.IsLast = snTag.Value.IsLast;
return pmTag; return pmTag;
case 20: case 20:
@@ -329,22 +540,22 @@ namespace DiscImageChef.Decoders
if(phTag == null) return null; if(phTag == null) return null;
pmTag = new PriamTag(); pmTag = new PriamTag();
pmTag.AbsPage = phTag.Value.AbsPage; pmTag.AbsPage = phTag.Value.AbsPage;
pmTag.Checksum = phTag.Value.Checksum; pmTag.Checksum = phTag.Value.Checksum;
pmTag.DiskSize = 0; pmTag.DiskSize = 0;
pmTag.FileId = phTag.Value.FileId; pmTag.FileId = phTag.Value.FileId;
pmTag.Kind = phTag.Value.Kind; pmTag.Kind = phTag.Value.Kind;
pmTag.NextBlock = phTag.Value.NextBlock; pmTag.NextBlock = phTag.Value.NextBlock;
pmTag.PrevBlock = phTag.Value.PrevBlock; pmTag.PrevBlock = phTag.Value.PrevBlock;
pmTag.RelPage = phTag.Value.RelPage; pmTag.RelPage = phTag.Value.RelPage;
pmTag.Reserved = phTag.Value.Reserved; pmTag.Reserved = phTag.Value.Reserved;
pmTag.UsedBytes = phTag.Value.UsedBytes; pmTag.UsedBytes = phTag.Value.UsedBytes;
pmTag.ValidChk = phTag.Value.ValidChk; pmTag.ValidChk = phTag.Value.ValidChk;
pmTag.Version = phTag.Value.Version; pmTag.Version = phTag.Value.Version;
pmTag.Volume = phTag.Value.Volume; pmTag.Volume = phTag.Value.Volume;
pmTag.IsFirst = phTag.Value.IsFirst; pmTag.IsFirst = phTag.Value.IsFirst;
pmTag.IsLast = phTag.Value.IsLast; pmTag.IsLast = phTag.Value.IsLast;
return pmTag; return pmTag;
case 24: return DecodePriamTag(tag); case 24: return DecodePriamTag(tag);