dmolony-DiskBrowser/src/com/bytezone/diskbrowser/prodos/write/DirectoryHeader.java

144 lines
5.3 KiB
Java

package com.bytezone.diskbrowser.prodos.write;
import static com.bytezone.diskbrowser.prodos.ProdosConstants.BLOCK_SIZE;
import static com.bytezone.diskbrowser.prodos.ProdosConstants.ENTRIES_PER_BLOCK;
import static com.bytezone.diskbrowser.prodos.ProdosConstants.ENTRY_SIZE;
import static com.bytezone.diskbrowser.utilities.Utility.getAppleDate;
import static com.bytezone.diskbrowser.utilities.Utility.putAppleDate;
import static com.bytezone.diskbrowser.utilities.Utility.unsignedShort;
import static com.bytezone.diskbrowser.utilities.Utility.writeShort;
import java.time.LocalDateTime;
// -----------------------------------------------------------------------------------//
public class DirectoryHeader
// -----------------------------------------------------------------------------------//
{
static final String UNDERLINE = "--------------------------------------------";
ProdosDisk disk;
byte[] buffer;
int ptr;
String fileName;
byte storageType;
LocalDateTime creationDate;
byte version = 0x00;
byte minVersion = 0x00;
byte access = (byte) 0xE3;
byte entryLength = ENTRY_SIZE;
byte entriesPerBlock = ENTRIES_PER_BLOCK;
int fileCount;
// ---------------------------------------------------------------------------------//
public DirectoryHeader (ProdosDisk disk, int ptr)
// ---------------------------------------------------------------------------------//
{
this.disk = disk;
this.buffer = disk.getBuffer ();
this.ptr = ptr;
}
// ---------------------------------------------------------------------------------//
void read ()
// ---------------------------------------------------------------------------------//
{
storageType = (byte) ((buffer[ptr] & 0xF0) >>> 4);
int nameLength = buffer[ptr] & 0x0F;
fileName = new String (buffer, ptr + 1, nameLength);
creationDate = getAppleDate (buffer, ptr + 0x18);
version = buffer[ptr + 0x1C];
minVersion = buffer[ptr + 0x1D];
access = buffer[ptr + 0x1E];
entryLength = buffer[ptr + 0x1F];
entriesPerBlock = buffer[ptr + 0x20];
fileCount = unsignedShort (buffer, ptr + 0x21);
}
// ---------------------------------------------------------------------------------//
void write ()
// ---------------------------------------------------------------------------------//
{
buffer[ptr] = (byte) ((storageType << 4) | fileName.length ());
System.arraycopy (fileName.getBytes (), 0, buffer, ptr + 1, fileName.length ());
putAppleDate (buffer, ptr + 0x18, creationDate);
buffer[ptr + 0x1C] = version;
buffer[ptr + 0x1D] = minVersion;
buffer[ptr + 0x1E] = access;
buffer[ptr + 0x1F] = entryLength;
buffer[ptr + 0x20] = entriesPerBlock;
writeShort (buffer, ptr + 0x21, fileCount);
}
// ---------------------------------------------------------------------------------//
void list ()
// ---------------------------------------------------------------------------------//
{
System.out.println (UNDERLINE);
System.out.println (toText ());
System.out.println (UNDERLINE);
int blockNo = ptr / BLOCK_SIZE;
do
{
int offset = blockNo * BLOCK_SIZE;
int ptr = offset + 4;
for (int i = 0; i < ENTRIES_PER_BLOCK; i++)
{
int storageType = (buffer[ptr] & 0xF0) >>> 4;
int nameLength = buffer[ptr] & 0x0F;
if (nameLength != 0 && storageType < 0x0E)
{
FileEntry fileEntry = new FileEntry (disk, ptr);
fileEntry.read ();
System.out.println (fileEntry.toText ());
}
ptr += ENTRY_SIZE;
}
blockNo = unsignedShort (buffer, offset + 2);
} while (blockNo > 0);
System.out.println ();
}
// ---------------------------------------------------------------------------------//
String toText ()
// ---------------------------------------------------------------------------------//
{
int block = ptr / BLOCK_SIZE;
int entry = ((ptr % BLOCK_SIZE) - 4) / 39 + 1;
return String.format ("%04X:%02X %-15s %02X %04X", block, entry, fileName,
storageType, fileCount);
}
// ---------------------------------------------------------------------------------//
@Override
public String toString ()
// ---------------------------------------------------------------------------------//
{
StringBuilder text = new StringBuilder ();
int blockNo = ptr / BLOCK_SIZE;
text.append (String.format ("Block ............ %04X%n", blockNo));
text.append (
String.format ("Entry ............ %02X%n", ((ptr % BLOCK_SIZE) - 4) / 39 + 1));
text.append (String.format ("Storage type ..... %02X %s%n", storageType,
ProdosDisk.storageTypes[storageType]));
text.append (String.format ("Name length ...... %02X%n", fileName.length ()));
text.append (String.format ("File name ........ %s%n", fileName));
text.append (String.format ("Version .......... %02X%n", version));
text.append (String.format ("Min version ...... %02X%n", minVersion));
text.append (String.format ("Created .......... %s%n", creationDate));
text.append (String.format ("Access ........... %02X%n", access));
text.append (String.format ("Entry length ..... %02X%n", entryLength));
text.append (String.format ("Entries per blk .. %02X%n", entriesPerBlock));
text.append (String.format ("File count ....... %d%n", fileCount));
return text.toString ();
}
}