mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-06-01 03:41:29 +00:00
134 lines
5.3 KiB
Java
134 lines
5.3 KiB
Java
package com.bytezone.diskbrowser.utilities;
|
|
|
|
// -----------------------------------------------------------------------------------//
|
|
class Record
|
|
// -----------------------------------------------------------------------------------//
|
|
{
|
|
private static String[] fileSystems =
|
|
{ "", "ProDOS/SOS", "DOS 3.3", "DOS 3.2", "Apple II Pascal", "Macintosh HFS",
|
|
"Macintosh MFS", "Lisa File System", "Apple CP/M", "", "MS-DOS", "High Sierra",
|
|
"ISO 9660", "AppleShare" };
|
|
|
|
private final int totThreads;
|
|
private final int crc;
|
|
private final char separator;
|
|
private final int fileSystemID;
|
|
private final int attributes;
|
|
private final int version;
|
|
private final int access;
|
|
private final int fileType;
|
|
private final int auxType;
|
|
private final int storType;
|
|
private final DateTime created;
|
|
private final DateTime modified;
|
|
private final DateTime archived;
|
|
private final int optionSize;
|
|
private final int fileNameLength;
|
|
private final String fileName;
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
public Record (byte[] buffer, int dataPtr) throws FileFormatException
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
// check for NuFX
|
|
if (!isNuFX (buffer, dataPtr))
|
|
throw new FileFormatException ("NuFX not found");
|
|
|
|
crc = Utility.getWord (buffer, dataPtr + 4);
|
|
attributes = Utility.getWord (buffer, dataPtr + 6);
|
|
version = Utility.getWord (buffer, dataPtr + 8);
|
|
totThreads = Utility.getLong (buffer, dataPtr + 10);
|
|
fileSystemID = Utility.getWord (buffer, dataPtr + 14);
|
|
separator = (char) (buffer[dataPtr + 16] & 0x00FF);
|
|
access = Utility.getLong (buffer, dataPtr + 18);
|
|
fileType = Utility.getLong (buffer, dataPtr + 22);
|
|
auxType = Utility.getLong (buffer, dataPtr + 26);
|
|
storType = Utility.getWord (buffer, dataPtr + 30);
|
|
created = new DateTime (buffer, dataPtr + 32);
|
|
modified = new DateTime (buffer, dataPtr + 40);
|
|
archived = new DateTime (buffer, dataPtr + 48);
|
|
optionSize = Utility.getWord (buffer, dataPtr + 56);
|
|
fileNameLength = Utility.getWord (buffer, dataPtr + attributes - 2);
|
|
|
|
int len = attributes + fileNameLength - 6;
|
|
byte[] crcBuffer = new byte[len + totThreads * 16];
|
|
System.arraycopy (buffer, dataPtr + 6, crcBuffer, 0, crcBuffer.length);
|
|
|
|
if (crc != Utility.getCRC (crcBuffer, 0))
|
|
{
|
|
System.out.println ("***** Header CRC mismatch *****");
|
|
throw new FileFormatException ("Header CRC failed");
|
|
}
|
|
|
|
if (fileNameLength > 0)
|
|
{
|
|
int start = dataPtr + attributes;
|
|
int end = start + fileNameLength;
|
|
for (int i = start; i < end; i++)
|
|
buffer[i] &= 0x7F;
|
|
fileName = new String (buffer, start, fileNameLength);
|
|
}
|
|
else
|
|
fileName = "";
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
private boolean isNuFX (byte[] buffer, int ptr)
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
if (buffer[ptr] == 0x4E && buffer[ptr + 1] == (byte) 0xF5 && buffer[ptr + 2] == 0x46
|
|
&& buffer[ptr + 3] == (byte) 0xD8)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
int getAttributes ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
return attributes;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
int getFileNameLength ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
return fileNameLength;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
int getTotalThreads ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
return totThreads;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
@Override
|
|
public String toString ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
StringBuilder text = new StringBuilder ();
|
|
|
|
text.append (String.format ("Header CRC ..... %,d (%04X)%n", crc, crc));
|
|
text.append (String.format ("Attributes ..... %d%n", attributes));
|
|
text.append (String.format ("Version ........ %d%n", version));
|
|
text.append (String.format ("Threads ........ %d%n", totThreads));
|
|
text.append (String.format ("File sys id .... %d (%s)%n", fileSystemID,
|
|
fileSystems[fileSystemID]));
|
|
text.append (String.format ("Separator ...... %s%n", separator));
|
|
text.append (String.format ("Access ......... %,d%n", access));
|
|
text.append (String.format ("File type ...... %,d%n", fileType));
|
|
text.append (String.format ("Aux type ....... %,d%n", auxType));
|
|
text.append (String.format ("Stor type ...... %,d%n", storType));
|
|
text.append (String.format ("Created ........ %s%n", created.format ()));
|
|
text.append (String.format ("Modified ....... %s%n", modified.format ()));
|
|
text.append (String.format ("Archived ....... %s%n", archived.format ()));
|
|
text.append (String.format ("Option size .... %,d%n", optionSize));
|
|
text.append (String.format ("Filename len ... %,d%n", fileNameLength));
|
|
text.append (String.format ("Filename ....... %s", fileName));
|
|
|
|
return text.toString ();
|
|
}
|
|
}
|