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

245 lines
7.9 KiB
Java
Raw Normal View History

2021-05-21 02:57:03 +00:00
package com.bytezone.diskbrowser.nufx;
import com.bytezone.diskbrowser.utilities.Utility;
2015-06-01 09:35:51 +00:00
2020-02-07 23:26:38 +00:00
// -----------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
class Thread
2020-02-07 23:26:38 +00:00
// -----------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
2021-04-18 07:34:35 +00:00
private static String[] threadClassText = { "Message", "Control", "Data", "Filename" };
private static String[] formatText =
{ "Uncompressed", "Huffman squeeze", "LZW/1", "LZW/2", "Unix 12-bit Compress",
"Unix 16-bit Compress" };
private static String[][] threadKindText =
{ { "ASCII text", "predefined EOF", "IIgs icon" },
{ "create directory", "undefined", "undefined" },
{ "data fork", "disk image", "resource fork" },
{ "filename", "undefined", "undefined" } };
2021-05-08 09:56:57 +00:00
private static final int DATA_FORK = 0;
private static final int DISK_IMAGE = 1;
private static final int RESOURCEFORK = 2;
2021-04-18 07:34:35 +00:00
final int threadClass;
final int threadFormat;
final int threadKind;
final int threadCrc;
final int uncompressedEOF;
final int compressedEOF;
2015-06-01 09:35:51 +00:00
private final byte[] data;
2021-04-15 07:27:20 +00:00
private String fileName;
2015-06-01 09:35:51 +00:00
private String message;
private LZW lzw;
2021-04-18 07:34:35 +00:00
2021-04-15 07:27:20 +00:00
private boolean hasDisk;
private boolean hasFile;
2021-05-03 20:12:44 +00:00
private boolean hasResource;
2021-04-15 07:27:20 +00:00
private boolean hasFileName;
2021-04-18 07:34:35 +00:00
2020-02-07 23:26:38 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
public Thread (byte[] buffer, int offset, int dataOffset)
2020-02-07 23:26:38 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
threadClass = Utility.getShort (buffer, offset);
threadFormat = Utility.getShort (buffer, offset + 2);
threadKind = Utility.getShort (buffer, offset + 4);
2015-06-01 09:35:51 +00:00
threadCrc = Utility.getShort (buffer, offset + 6);
2021-04-18 07:34:35 +00:00
uncompressedEOF = Utility.getLong (buffer, offset + 8);
compressedEOF = Utility.getLong (buffer, offset + 12);
data = new byte[compressedEOF];
2015-06-01 09:35:51 +00:00
System.arraycopy (buffer, dataOffset, data, 0, data.length);
2021-04-18 07:34:35 +00:00
switch (threadFormat)
{
2021-04-18 10:11:26 +00:00
case 0: // uncompressed
2021-04-18 07:34:35 +00:00
break;
2021-04-27 11:26:09 +00:00
case 1: // Huffman Squeeze - see archivers folder
System.out.printf ("Huffman squeeze");
2021-04-18 07:34:35 +00:00
break;
2021-04-18 10:11:26 +00:00
case 2: // Dynamic LZW/1
2021-04-18 07:34:35 +00:00
lzw = new LZW1 (data);
break;
2021-04-18 10:11:26 +00:00
case 3: // Dynamic LZW/2
2021-04-18 07:34:35 +00:00
int crcLength = threadKind == 1 ? 0 : uncompressedEOF;
lzw = new LZW2 (data, threadCrc, crcLength);
break;
2021-04-18 10:11:26 +00:00
case 4: // Unix 12-bit compress
2021-04-18 07:34:35 +00:00
break;
2021-04-18 10:11:26 +00:00
case 5: // Unix 16-bit compress
2021-04-18 07:34:35 +00:00
break;
}
switch (threadClass)
2015-06-01 09:35:51 +00:00
{
case 0:
2021-04-18 07:34:35 +00:00
switch (threadKind)
{
case 0: // ASCII text (obsolete)
break;
case 1: // comp/uncomp eof may change
message = new String (data, 0, uncompressedEOF);
break;
case 2: // Apple IIgs icon
break;
}
2015-06-01 09:35:51 +00:00
break;
case 1:
2021-04-18 07:34:35 +00:00
switch (threadKind)
{
case 0: // create directory
break;
case 1: // undefined
case 2: // undefined
break;
}
2015-06-01 09:35:51 +00:00
break;
case 2:
2021-04-18 07:34:35 +00:00
switch (threadKind)
2015-06-01 09:35:51 +00:00
{
2021-05-08 09:56:57 +00:00
case DATA_FORK:
2021-04-18 07:34:35 +00:00
hasFile = true;
break;
2021-05-08 09:56:57 +00:00
case DISK_IMAGE:
2021-04-18 07:34:35 +00:00
hasDisk = true;
break;
2021-05-08 09:56:57 +00:00
case RESOURCEFORK:
2021-05-03 20:12:44 +00:00
hasResource = true;
2021-04-18 07:34:35 +00:00
break;
2015-06-01 09:35:51 +00:00
}
2021-04-15 07:27:20 +00:00
2015-06-01 09:35:51 +00:00
break;
case 3:
2021-04-18 07:34:35 +00:00
switch (threadKind)
2021-04-15 07:27:20 +00:00
{
2021-05-01 23:38:24 +00:00
case 0: // filename
2021-04-18 07:34:35 +00:00
hasFileName = true;
fileName = new String (data, 0, uncompressedEOF);
break;
2021-05-01 23:38:24 +00:00
case 1: // undefined
2021-04-18 10:11:26 +00:00
break;
2021-05-01 23:38:24 +00:00
case 2: // undefined
2021-04-18 07:34:35 +00:00
break;
2021-04-15 07:27:20 +00:00
}
2015-06-01 09:35:51 +00:00
break;
default:
2021-04-18 07:34:35 +00:00
System.out.println ("Unknown threadClass: " + threadClass);
2015-06-01 09:35:51 +00:00
}
}
2021-04-15 07:27:20 +00:00
// ---------------------------------------------------------------------------------//
boolean hasFile (String fileName)
// ---------------------------------------------------------------------------------//
{
2021-04-18 07:34:35 +00:00
return threadClass == 3 && this.fileName != null && this.fileName.equals (fileName);
2021-04-15 07:27:20 +00:00
}
2020-02-07 23:26:38 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
public byte[] getData ()
2020-02-07 23:26:38 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
2021-04-18 07:34:35 +00:00
if (threadFormat == 0) // uncompressed
2021-04-15 07:27:20 +00:00
return data;
return lzw.getData ();
2015-06-01 09:35:51 +00:00
}
2020-02-07 23:26:38 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
int getCompressedEOF ()
2020-02-07 23:26:38 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
2021-04-18 07:34:35 +00:00
return compressedEOF;
2015-06-01 09:35:51 +00:00
}
2021-04-15 07:27:20 +00:00
// ---------------------------------------------------------------------------------//
int getUncompressedEOF ()
// ---------------------------------------------------------------------------------//
{
2021-04-18 07:34:35 +00:00
return uncompressedEOF;
2021-04-15 07:27:20 +00:00
}
2020-02-07 23:26:38 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
public boolean hasDisk ()
2020-02-07 23:26:38 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
2021-04-15 07:27:20 +00:00
return hasDisk;
}
// ---------------------------------------------------------------------------------//
public boolean hasFile ()
// ---------------------------------------------------------------------------------//
{
return hasFile;
}
2021-05-03 20:12:44 +00:00
// ---------------------------------------------------------------------------------//
public boolean hasResource ()
// ---------------------------------------------------------------------------------//
{
return hasResource;
}
2021-04-15 07:27:20 +00:00
// ---------------------------------------------------------------------------------//
public boolean hasFileName ()
// ---------------------------------------------------------------------------------//
{
return hasFileName;
}
// ---------------------------------------------------------------------------------//
String getFileName ()
// ---------------------------------------------------------------------------------//
{
return fileName;
}
2021-05-08 09:56:57 +00:00
// Called by Record.getFileSize()
2021-04-15 07:27:20 +00:00
// ---------------------------------------------------------------------------------//
int getFileSize ()
// ---------------------------------------------------------------------------------//
{
2021-05-08 09:56:57 +00:00
// if (lzw != null)
// System.out.printf ("%04X v %04X v %04X%n", compressedEOF, uncompressedEOF,
// lzw.getSize ());
2021-05-01 23:38:24 +00:00
return lzw != null ? lzw.getSize () : uncompressedEOF;
2021-05-03 20:12:44 +00:00
// return uncompressedEOF;
2015-06-01 09:35:51 +00:00
}
2020-02-07 23:26:38 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
@Override
public String toString ()
2020-02-07 23:26:38 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
2021-04-18 07:34:35 +00:00
StringBuilder text = new StringBuilder ();
text.append (String.format (" threadClass ....... %d %s%n", threadClass,
threadClassText[threadClass]));
text.append (String.format (" format ............ %d %s%n", threadFormat,
formatText[threadFormat]));
text.append (String.format (" kind .............. %d %s%n", threadKind,
threadKindText[threadClass][threadKind]));
text.append (String.format (" crc ............... %,d (%<04X)%n", threadCrc));
text.append (String.format (" uncompressedEOF ... %,d (%<08X)%n", uncompressedEOF));
text.append (String.format (" compressedEOF ..... %,d (%<08X)", compressedEOF));
2015-06-01 09:35:51 +00:00
2021-04-15 07:27:20 +00:00
if (fileName != null)
text.append ("\n filename .......... " + fileName);
2015-06-01 09:35:51 +00:00
else if (message != null)
text.append ("\n message ........... " + message);
else if (lzw != null)
{
text.append ("\n");
text.append (lzw);
}
return text.toString ();
}
}