dmolony-DiskBrowser/src/com/bytezone/diskbrowser/nufx/Binary2.java

112 lines
3.8 KiB
Java
Raw Normal View History

2021-05-21 02:57:03 +00:00
package com.bytezone.diskbrowser.nufx;
2021-05-12 07:08:24 +00:00
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import com.bytezone.diskbrowser.prodos.write.DiskFullException;
import com.bytezone.diskbrowser.prodos.write.FileAlreadyExistsException;
import com.bytezone.diskbrowser.prodos.write.ProdosDisk;
import com.bytezone.diskbrowser.prodos.write.VolumeCatalogFullException;
2022-07-30 23:21:52 +00:00
import com.bytezone.diskbrowser.utilities.Utility;
2021-05-12 07:08:24 +00:00
// -----------------------------------------------------------------------------------//
public class Binary2
// -----------------------------------------------------------------------------------//
{
private static final String UNDERLINE =
2023-04-07 09:50:02 +00:00
"------------------------------------------------------"
+ "-----------------------";
2021-05-12 07:08:24 +00:00
2022-07-31 00:08:15 +00:00
private Binary2Header binary2Header;
private byte[] buffer;
private List<Binary2Header> headers = new ArrayList<> ();
private int totalBlocks;
private String fileName;
2021-05-12 07:08:24 +00:00
// ---------------------------------------------------------------------------------//
public Binary2 (Path path) throws IOException
// ---------------------------------------------------------------------------------//
{
fileName = path.toFile ().getName ();
buffer = Files.readAllBytes (path);
2021-08-20 10:04:53 +00:00
read (buffer);
}
// ---------------------------------------------------------------------------------//
private void read (byte[] buffer)
// ---------------------------------------------------------------------------------//
{
2021-05-12 07:08:24 +00:00
int ptr = 0;
do
{
binary2Header = new Binary2Header (buffer, ptr);
2022-07-30 23:58:00 +00:00
ptr += ((binary2Header.eof - 1) / 128 + 2) * 128;
2022-08-10 11:01:21 +00:00
if (ptr > buffer.length) // not enough blocks for this file
break;
2022-08-22 06:55:32 +00:00
totalBlocks += binary2Header.totalBlocks;
2022-08-10 11:01:21 +00:00
headers.add (binary2Header);
2021-05-12 07:08:24 +00:00
} while (binary2Header.filesToFollow > 0);
}
// ---------------------------------------------------------------------------------//
2023-04-07 09:50:02 +00:00
public byte[] getDiskBuffer () throws DiskFullException, VolumeCatalogFullException,
FileAlreadyExistsException, IOException
2021-05-12 07:08:24 +00:00
// ---------------------------------------------------------------------------------//
{
ProdosDisk disk = new ProdosDisk (800, "DiskBrowser");
for (Binary2Header header : headers)
{
2022-07-30 23:58:00 +00:00
byte[] dataBuffer = new byte[header.eof]; // this sux
System.arraycopy (buffer, header.ptr + 128, dataBuffer, 0, dataBuffer.length);
if (header.compressed && dataBuffer[0] == 0x76 && dataBuffer[1] == (byte) 0xFF)
2022-07-30 23:21:52 +00:00
{
2022-07-30 23:58:00 +00:00
String name = Utility.getCString (dataBuffer, 4);
2022-07-30 23:21:52 +00:00
Squeeze squeeze = new Squeeze ();
2022-07-30 23:58:00 +00:00
byte[] tmp = squeeze.unSqueeze (dataBuffer);
2023-04-07 09:50:02 +00:00
disk.addFile (name, header.fileType, header.auxType, header.created,
header.modified, tmp, tmp.length);
2022-07-30 23:21:52 +00:00
}
else
disk.addFile (header.fileName, header.fileType, header.auxType, header.created,
header.modified, dataBuffer, header.eof);
2021-05-12 07:08:24 +00:00
}
disk.close ();
return disk.getBuffer ();
}
// ---------------------------------------------------------------------------------//
@Override
public String toString ()
// ---------------------------------------------------------------------------------//
{
StringBuilder text = new StringBuilder ();
2023-04-07 09:50:02 +00:00
text.append (String.format (
" %-15.15s Files:%5d%n%n",
fileName, headers.size ()));
2021-05-12 07:08:24 +00:00
2023-04-07 09:50:02 +00:00
text.append (" Name Type Auxtyp Modified"
+ " Fmat Length\n");
2021-05-12 07:08:24 +00:00
text.append (String.format ("%s%n", UNDERLINE));
for (Binary2Header header : headers)
text.append (String.format ("%s%n", header.getLine ()));
text.append (String.format ("%s%n", UNDERLINE));
return text.toString ();
}
}