dmolony-DiskBrowser/src/com/bytezone/diskbrowser/pascal/FileEntry.java

145 lines
4.7 KiB
Java

package com.bytezone.diskbrowser.pascal;
import javax.swing.tree.DefaultMutableTreeNode;
import com.bytezone.diskbrowser.applefile.AbstractFile;
import com.bytezone.diskbrowser.applefile.AssemblerProgram;
import com.bytezone.diskbrowser.applefile.Charset;
import com.bytezone.diskbrowser.applefile.DefaultAppleFile;
import com.bytezone.diskbrowser.applefile.PascalCode;
import com.bytezone.diskbrowser.applefile.PascalInfo;
import com.bytezone.diskbrowser.applefile.PascalSegment;
import com.bytezone.diskbrowser.applefile.PascalText;
import com.bytezone.diskbrowser.utilities.FileFormatException;
import com.bytezone.diskbrowser.utilities.Utility;
// -----------------------------------------------------------------------------------//
public class FileEntry extends CatalogEntry
// -----------------------------------------------------------------------------------//
{
private DefaultMutableTreeNode node;
// ---------------------------------------------------------------------------------//
public FileEntry (PascalDisk parent, byte[] buffer)
// ---------------------------------------------------------------------------------//
{
super (parent, buffer);
bytesUsedInLastBlock = Utility.getShort (buffer, 22);
localDate = Utility.getPascalLocalDate (buffer, 24);
int max = Math.min (lastBlock, parent.getDisk ().getTotalBlocks ());
for (int i = firstBlock; i < max; i++)
{
if (fileType < parent.sectors.length)
parent.sectorTypes[i] = parent.sectors[fileType];
else
{
System.out.println ("Unknown pascal file type : " + fileType);
parent.sectorTypes[i] = parent.dataSector;
}
}
}
// ---------------------------------------------------------------------------------//
void setNode (DefaultMutableTreeNode node)
// ---------------------------------------------------------------------------------//
{
this.node = node;
}
// ---------------------------------------------------------------------------------//
public void setFile (AbstractFile file)
// ---------------------------------------------------------------------------------//
{
this.file = file;
}
// ---------------------------------------------------------------------------------//
@Override
public AbstractFile getDataSource ()
// ---------------------------------------------------------------------------------//
{
if (file != null) // previously built
return file;
// check for empty file (e.g. see DC16.dsk)
if (firstBlock == lastBlock)
{
file = new DefaultAppleFile (name, new byte[0]);
node.setAllowsChildren (false);
return file;
}
byte[] buffer = getExactBuffer ();
switch (fileType)
{
case 2: // code (6502 or Pascal)
try
{
file = new PascalCode (name, buffer, firstBlock);
node.removeAllChildren ();
for (PascalSegment pascalSegment : (PascalCode) file)
{
DefaultMutableTreeNode segmentNode = new DefaultMutableTreeNode (
new PascalCodeObject (parent, pascalSegment, firstBlock));
segmentNode.setAllowsChildren (false);
node.add (segmentNode);
}
}
catch (FileFormatException e)
{
if (name.equals ("SYSTEM.INTERP"))
file = new AssemblerProgram (name, buffer, 0xD000);
else
file = new AssemblerProgram (name, buffer, 0);
node.setAllowsChildren (false);
}
break;
case 3:
file = new PascalText (name, buffer);
break;
case 4:
file = new PascalInfo (name, buffer);
break;
case 5: // data
if (name.equals ("SYSTEM.CHARSET"))
file = new Charset (name, buffer);
else
file = new DefaultAppleFile (name, buffer);
break;
case 0: // volume
break;
default: // unknown
file = new DefaultAppleFile (name, buffer);
}
return file;
}
// ---------------------------------------------------------------------------------//
private byte[] getExactBuffer ()
// ---------------------------------------------------------------------------------//
{
byte[] buffer = parent.getDisk ().readBlocks (blocks);
byte[] exactBuffer;
if (buffer.length > 0 && bytesUsedInLastBlock < 512)
{
int exactLength = buffer.length - 512 + bytesUsedInLastBlock;
exactBuffer = new byte[exactLength];
System.arraycopy (buffer, 0, exactBuffer, 0, exactLength);
}
else
exactBuffer = buffer;
return exactBuffer;
}
}