dmolony-DiskBrowser/src/com/bytezone/diskbrowser/dos/DeletedCatalogEntry.java

133 lines
4.0 KiB
Java

package com.bytezone.diskbrowser.dos;
import com.bytezone.diskbrowser.applefile.DefaultAppleFile;
import com.bytezone.diskbrowser.disk.AppleDiskAddress;
import com.bytezone.diskbrowser.disk.DiskAddress;
import com.bytezone.diskbrowser.gui.DataSource;
// -----------------------------------------------------------------------------------//
class DeletedCatalogEntry extends AbstractCatalogEntry
// -----------------------------------------------------------------------------------//
{
boolean allSectorsAvailable = true;
boolean debug = false;
// ---------------------------------------------------------------------------------//
DeletedCatalogEntry (DosDisk dosDisk, DiskAddress catalogSector, byte[] entryBuffer,
int dosVersion)
// ---------------------------------------------------------------------------------//
{
super (dosDisk, catalogSector, entryBuffer);
if (debug)
{
System.out.println ("Deleted file : " + name);
System.out.printf ("Reported size : %d%n", reportedSize);
}
DiskAddress da = null;
// Get address of first TS-list sector
if (dosVersion >= 0x41)
{
int track = entryBuffer[0] & 0x3F;
int sector = entryBuffer[1] & 0x1F;
da = disk.getDiskAddress (track, sector);
}
else
{
int track = entryBuffer[32] & 0xFF;
int sector = entryBuffer[1] & 0xFF;
da = disk.getDiskAddress (track, sector);
}
int totalBlocks = 0;
if (reportedSize <= 1 || !disk.isValidAddress (da.getTrackNo (), da.getSectorNo ()))
{
if (debug)
System.out.println ("invalid catalog entry");
allSectorsAvailable = false;
return;
}
// Loop through all TS-list sectors
loop: while (!da.isZero () || ((AppleDiskAddress) da).zeroFlag ())
{
if (!dosDisk.stillAvailable (da))
{
allSectorsAvailable = false;
break;
}
tsSectors.add (da);
totalBlocks++;
DiskAddress sectorDA = da;
byte[] sectorBuffer = disk.readBlock (da);
for (int i = 12, max = disk.getBlockSize (); i < max; i += 2)
{
da = getValidAddress (sectorBuffer, i);
if (da == null)
break loop;
if (!da.isZero () && debug)
System.out.println (da);
if (!da.isZero () || ((AppleDiskAddress) da).zeroFlag ())
{
if (!dosDisk.stillAvailable (da))
{
allSectorsAvailable = false;
break loop;
}
dataSectors.add (da);
totalBlocks++;
}
}
DiskAddress nextDa = getValidAddress (sectorBuffer, 1);
if (nextDa == null)
{
System.out.printf ("Next T/S list in sector %s is invalid : %02X, %02X%n",
sectorDA, sectorBuffer[1], sectorBuffer[2]);
break;
}
da = nextDa;
}
if (debug)
System.out.printf ("Total blocks recoverable : %d%n", totalBlocks);
if (totalBlocks != reportedSize)
allSectorsAvailable = false;
}
// ---------------------------------------------------------------------------------//
@Override
public String getUniqueName ()
// ---------------------------------------------------------------------------------//
{
// name might not be unique if the file has been deleted
return "!" + name;
}
// ---------------------------------------------------------------------------------//
@Override
public DataSource getDataSource ()
// ---------------------------------------------------------------------------------//
{
if (!allSectorsAvailable && appleFile == null)
{
DefaultAppleFile daf = new DefaultAppleFile (name, null);
daf.setText ("This file cannot be recovered");
appleFile = daf;
}
return super.getDataSource ();
}
// ---------------------------------------------------------------------------------//
String getDetails ()
// ---------------------------------------------------------------------------------//
{
return String.format ("%-30s %s", name,
allSectorsAvailable ? "Recoverable" : "Not recoverable");
}
}