com.webcodepro.applecommander.storage.os.prodos
Class ProdosFormatDisk

java.lang.Object
  extended by com.webcodepro.applecommander.storage.Disk
      extended by com.webcodepro.applecommander.storage.FormattedDisk
          extended by com.webcodepro.applecommander.storage.os.prodos.ProdosFormatDisk
All Implemented Interfaces:
DirectoryEntry

public class ProdosFormatDisk
extends FormattedDisk

Manages a disk that is in the ProDOS format.

Date created: Oct 3, 2002 11:45:25 PM

Author:
Rob Greene

Nested Class Summary
 
Nested classes/interfaces inherited from class com.webcodepro.applecommander.storage.FormattedDisk
FormattedDisk.DiskInformation, FormattedDisk.DiskUsage, FormattedDisk.FileColumnHeader
 
Nested classes/interfaces inherited from class com.webcodepro.applecommander.storage.Disk
Disk.FilenameFilter
 
Field Summary
 
Fields inherited from class com.webcodepro.applecommander.storage.FormattedDisk
FILE_DISPLAY_DETAIL, FILE_DISPLAY_NATIVE, FILE_DISPLAY_STANDARD
 
Fields inherited from class com.webcodepro.applecommander.storage.Disk
APPLE_10MB_HARDDISK, APPLE_140KB_DISK, APPLE_140KB_NIBBLE_DISK, APPLE_20MB_HARDDISK, APPLE_32MB_HARDDISK, APPLE_5MB_HARDDISK, APPLE_800KB_2IMG_DISK, APPLE_800KB_DISK, BLOCK_SIZE, DOS33_SECTORS_ON_140KB_DISK, PRODOS_BLOCKS_ON_140KB_DISK, SECTOR_SIZE
 
Constructor Summary
ProdosFormatDisk(java.lang.String filename, ImageOrder imageOrder)
          Constructor for ProdosFormatDisk.
 
Method Summary
 boolean canCompile(java.lang.String filetype)
          Indicates if this filetype can be compiled.
 boolean canCreateDirectories()
          Identify if additional directories can be created.
 boolean canCreateFile()
          Indicates if this disk image can create a file.
 boolean canDeleteFile()
          Indicates if this disk image can delete a file.
 boolean canHaveDirectories()
          Identify if this disk format is capable of having directories.
 boolean canReadFileData()
          Indicates if this disk image can read data from a file.
 boolean canWriteFileData()
          Indicates if this disk image can write data to a file.
 void changeImageOrder(ImageOrder imageOrder)
          Change to a different ImageOrder.
static ProdosFormatDisk[] create(java.lang.String filename, java.lang.String diskName, ImageOrder imageOrder)
          Create a ProdosFormatDisk.
 DirectoryEntry createDirectory()
          Create a new DirectoryEntry.
 FileEntry createFile()
          Create a FileEntry in the Volume Directory.
 FileEntry createFile(ProdosCommonDirectoryHeader directory)
          Create a FileEntry in the given directory.
 com.webcodepro.applecommander.storage.os.prodos.ProdosFormatDisk.ProdosFileType findFileType(java.lang.String filetype)
          Locate the associated ProdosFileType.
protected  int findFreeBlock(byte[] volumeBitmap)
          Locate a free block in the Volume Bitmap.
 void format()
          Format the ProDOS volume.
protected  void freeBlocks(ProdosFileEntry prodosFileEntry)
          Free blocks used by a DosFileEntry.
 int[] getBitmapDimensions()
          Get suggested dimensions for display of bitmap.
 java.lang.String[] getBitmapLabels()
          Get the labels to use in the bitmap.
 int getBitmapLength()
          Get the length of the bitmap.
 java.util.List getDiskInformation()
          Get Pascal-specific disk information.
 java.lang.String getDiskName()
          Return the name of the disk.
 FormattedDisk.DiskUsage getDiskUsage()
          Get the disk usage iterator.
 java.util.List getFileColumnHeaders(int displayMode)
          Get the standard file column header information.
 byte[] getFileData(FileEntry fileEntry)
          Get the data associated with the specified FileEntry.
 java.util.List getFiles()
          Retrieve a list of files.
protected  java.util.List getFiles(int blockNumber)
          Build a list of files, starting in the given block number.
 java.lang.String getFiletype(int filetype)
          Return the filetype of this file.
 byte getFiletype(java.lang.String filetype)
          Get the numerical filetype.
 java.lang.String[] getFiletypes()
          Returns a list of possible file types.
 java.lang.String getFormat()
          Identify the operating system format of this disk.
 int getFreeBlocks()
          Return the number of free blocks on the disk.
 int getFreeSpace()
          Return the amount of free space in bytes.
protected  int getIndexBlockData(byte[] fileData, byte[] indexBlock, int offset)
          Read file data from the given index block.
 int getLogicalDiskNumber()
          Returns the logical disk number.
 java.lang.String getSuggestedFilename(java.lang.String filename)
          Returns a valid filename for the given filename.
 java.lang.String getSuggestedFiletype(java.lang.String filename)
          Returns a valid filetype for the given filename.
 int getUsedBlocks()
          Return the number of used blocks on the disk.
 int getUsedSpace()
          Return the amount of used space in bytes.
protected  ProdosVolumeDirectoryHeader getVolumeHeader()
           
protected  void initialize()
          Initialize all file types.
 boolean isBlockFree(byte[] data, int blockNumber)
          Determine if the specified block is free.
 boolean isBlockUsed(byte[] data, int blockNumber)
          Determine if the specified block is used.
 boolean needsAddress(java.lang.String filetype)
          Indicates if this filetype requires an address component.
 byte[] readVolumeBitMap()
          Read the Volume Bit Map.
 void setBlockFree(byte[] data, int blockNumber)
          Set if the specified block is free.
 void setBlockUsed(byte[] data, int blockNumber)
          Set if the specified block is free.
 void setDiskName(java.lang.String volumeName)
          Set the name of the disk (volume name).
 void setFileData(FileEntry fileEntry, byte[] fileData)
          Writes the raw bytes into the file.
protected  void setFileData(ProdosFileEntry fileEntry, byte[] fileData)
          Set the data associated with the specified ProdosFileEntry into sectors on the disk.
 boolean supportsDeletedFiles()
          Indicates if this disk format supports "deleted" files.
 boolean supportsDiskMap()
          Indicates if this FormattedDisk supports a disk map.
 void writeVolumeBitMap(byte[] data)
          Write the Volume Bit Map.
 
Methods inherited from class com.webcodepro.applecommander.storage.FormattedDisk
getFile, getFile, getFormattedDisk, resizeDiskImage, writeBootCode
 
Methods inherited from class com.webcodepro.applecommander.storage.Disk
getDiskImageManager, getFilename, getFilenameFilters, getFormattedDisks, getImageOrder, getPhysicalSize, hasChanged, is140KbDisk, is2ImgOrder, is800KbDisk, isCompressed, isCpmFormat, isDosFormat, isDosOrder, isNewImage, isNibbleOrder, isOzDosFormat, isPascalFormat, isProdosFormat, isProdosOrder, isRdosFormat, isUniDosFormat, readBlock, readSector, resizeDiskImage, save, saveAs, setFilename, setImageOrder, writeBlock, writeSector
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ProdosFormatDisk

public ProdosFormatDisk(java.lang.String filename,
                        ImageOrder imageOrder)
Constructor for ProdosFormatDisk.

Parameters:
filename -
Method Detail

initialize

protected void initialize()
Initialize all file types.


create

public static ProdosFormatDisk[] create(java.lang.String filename,
                                        java.lang.String diskName,
                                        ImageOrder imageOrder)
Create a ProdosFormatDisk.


getFormat

public java.lang.String getFormat()
Identify the operating system format of this disk.

Specified by:
getFormat in class FormattedDisk
See Also:
FormattedDisk.getFormat()

createFile

public FileEntry createFile()
                     throws DiskFullException
Create a FileEntry in the Volume Directory.

Throws:
DiskFullException

createFile

public FileEntry createFile(ProdosCommonDirectoryHeader directory)
                     throws DiskFullException
Create a FileEntry in the given directory.

Throws:
DiskFullException

getFiles

public java.util.List getFiles()
Retrieve a list of files.

See Also:
DirectoryEntry.getFiles()

getFiles

protected java.util.List getFiles(int blockNumber)
Build a list of files, starting in the given block number. This works for the master as well as the subdirectories.


getFreeSpace

public int getFreeSpace()
Return the amount of free space in bytes.

Specified by:
getFreeSpace in class FormattedDisk
See Also:
FormattedDisk.getFreeSpace()

getFreeBlocks

public int getFreeBlocks()
Return the number of free blocks on the disk.


getUsedSpace

public int getUsedSpace()
Return the amount of used space in bytes.

Specified by:
getUsedSpace in class FormattedDisk
See Also:
FormattedDisk.getUsedSpace()

getUsedBlocks

public int getUsedBlocks()
Return the number of used blocks on the disk.


canCreateDirectories

public boolean canCreateDirectories()
Identify if additional directories can be created. This may indicate that directories are not available to this operating system or simply that the disk image is "locked" to writing.


canCreateFile

public boolean canCreateFile()
Indicates if this disk image can create a file. If not, the reason may be as simple as it has not beem implemented to something specific about the disk.


getDiskName

public java.lang.String getDiskName()
Return the name of the disk.

Specified by:
getDiskName in class FormattedDisk
See Also:
FormattedDisk.getDiskName()

setDiskName

public void setDiskName(java.lang.String volumeName)
Set the name of the disk (volume name).


getBitmapDimensions

public int[] getBitmapDimensions()
Get suggested dimensions for display of bitmap. There is no suggestion for a ProDOS volume - it is just a series of blocks.

Specified by:
getBitmapDimensions in class FormattedDisk

getBitmapLength

public int getBitmapLength()
Get the length of the bitmap.

Specified by:
getBitmapLength in class FormattedDisk

getDiskUsage

public FormattedDisk.DiskUsage getDiskUsage()
Get the disk usage iterator.

Specified by:
getDiskUsage in class FormattedDisk

getBitmapLabels

public java.lang.String[] getBitmapLabels()
Get the labels to use in the bitmap.

Specified by:
getBitmapLabels in class FormattedDisk

getDiskInformation

public java.util.List getDiskInformation()
Get Pascal-specific disk information.

Overrides:
getDiskInformation in class FormattedDisk

getFileColumnHeaders

public java.util.List getFileColumnHeaders(int displayMode)
Get the standard file column header information. This default implementation is intended only for standard mode.

Overrides:
getFileColumnHeaders in class FormattedDisk

supportsDeletedFiles

public boolean supportsDeletedFiles()
Indicates if this disk format supports "deleted" files.

Specified by:
supportsDeletedFiles in class FormattedDisk

canReadFileData

public boolean canReadFileData()
Indicates if this disk image can read data from a file.

Specified by:
canReadFileData in class FormattedDisk

canHaveDirectories

public boolean canHaveDirectories()
Identify if this disk format is capable of having directories.

Specified by:
canHaveDirectories in class FormattedDisk
See Also:
FormattedDisk.canHaveDirectories()

canWriteFileData

public boolean canWriteFileData()
Indicates if this disk image can write data to a file.

Specified by:
canWriteFileData in class FormattedDisk

canDeleteFile

public boolean canDeleteFile()
Indicates if this disk image can delete a file.

Specified by:
canDeleteFile in class FormattedDisk

getFileData

public byte[] getFileData(FileEntry fileEntry)
Get the data associated with the specified FileEntry. Note that this could return a 16MB file! Sparse files are not treated specially.

Specified by:
getFileData in class FormattedDisk
See Also:
FileEntry.getFileData()

freeBlocks

protected void freeBlocks(ProdosFileEntry prodosFileEntry)
Free blocks used by a DosFileEntry.


getIndexBlockData

protected int getIndexBlockData(byte[] fileData,
                                byte[] indexBlock,
                                int offset)
Read file data from the given index block. Note that block number 0 is an unused block.


setFileData

protected void setFileData(ProdosFileEntry fileEntry,
                           byte[] fileData)
                    throws DiskFullException
Set the data associated with the specified ProdosFileEntry into sectors on the disk.

Throws:
DiskFullException

findFreeBlock

protected int findFreeBlock(byte[] volumeBitmap)
                     throws DiskFullException
Locate a free block in the Volume Bitmap.

Throws:
DiskFullException

readVolumeBitMap

public byte[] readVolumeBitMap()
Read the Volume Bit Map.


writeVolumeBitMap

public void writeVolumeBitMap(byte[] data)
Write the Volume Bit Map.


isBlockFree

public boolean isBlockFree(byte[] data,
                           int blockNumber)
Determine if the specified block is free.


setBlockFree

public void setBlockFree(byte[] data,
                         int blockNumber)
Set if the specified block is free.


isBlockUsed

public boolean isBlockUsed(byte[] data,
                           int blockNumber)
Determine if the specified block is used.


setBlockUsed

public void setBlockUsed(byte[] data,
                         int blockNumber)
Set if the specified block is free.


format

public void format()
Format the ProDOS volume.

Specified by:
format in class FormattedDisk
See Also:
FormattedDisk.format()

getLogicalDiskNumber

public int getLogicalDiskNumber()
Returns the logical disk number. Returns a 0 to indicate no numbering.

Specified by:
getLogicalDiskNumber in class FormattedDisk

getSuggestedFilename

public java.lang.String getSuggestedFilename(java.lang.String filename)
Returns a valid filename for the given filename. ProDOS filenames have a maximum length of 15 characters, must start with a character and may contain characters (A-Z), digits (0-9), or the period (.).

Specified by:
getSuggestedFilename in class FormattedDisk

getSuggestedFiletype

public java.lang.String getSuggestedFiletype(java.lang.String filename)
Returns a valid filetype for the given filename. The most simple format will just assume a filetype of binary. This method is available for the interface to make an intelligent first guess as to the filetype.

Specified by:
getSuggestedFiletype in class FormattedDisk

getFiletype

public java.lang.String getFiletype(int filetype)
Return the filetype of this file. This will be three characters, according to ProDOS - a "$xx" if unknown.


getFiletype

public byte getFiletype(java.lang.String filetype)
Get the numerical filetype.


findFileType

public com.webcodepro.applecommander.storage.os.prodos.ProdosFormatDisk.ProdosFileType findFileType(java.lang.String filetype)
Locate the associated ProdosFileType.


getFiletypes

public java.lang.String[] getFiletypes()
Returns a list of possible file types. Since the filetype is specific to each operating system, a simple String is used.

Specified by:
getFiletypes in class FormattedDisk

needsAddress

public boolean needsAddress(java.lang.String filetype)
Indicates if this filetype requires an address component.

Specified by:
needsAddress in class FormattedDisk

canCompile

public boolean canCompile(java.lang.String filetype)
Indicates if this filetype can be compiled.


supportsDiskMap

public boolean supportsDiskMap()
Indicates if this FormattedDisk supports a disk map.

Overrides:
supportsDiskMap in class FormattedDisk

changeImageOrder

public void changeImageOrder(ImageOrder imageOrder)
Change to a different ImageOrder. Remains in ProDOS format but the underlying order can chage.

Specified by:
changeImageOrder in class FormattedDisk
See Also:
ImageOrder

setFileData

public void setFileData(FileEntry fileEntry,
                        byte[] fileData)
                 throws DiskFullException
Writes the raw bytes into the file. This bypasses any special formatting of the data (such as prepending the data with a length and/or an address). Typically, the FileEntry.setFileData method should be used.

Specified by:
setFileData in class FormattedDisk
Throws:
DiskFullException

getVolumeHeader

protected ProdosVolumeDirectoryHeader getVolumeHeader()

createDirectory

public DirectoryEntry createDirectory()
                               throws DiskFullException
Create a new DirectoryEntry.

Throws:
DiskFullException
See Also:
DirectoryEntry.createDirectory()