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

136 lines
3.9 KiB
Java

package com.bytezone.diskbrowser;
import com.bytezone.common.Utility;
class Thread
{
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" } };
private final ThreadHeader header;
private final byte[] data;
private String filename;
private String message;
private LZW lzw;
public Thread (byte[] buffer, int offset, int dataOffset)
{
header = new ThreadHeader (buffer, offset);
data = new byte[header.compressedEOF];
System.arraycopy (buffer, dataOffset, data, 0, data.length);
switch (header.threadClass)
{
case 0:
if (header.threadKind == 1)
message = new String (data, 0, header.uncompressedEOF);
break;
case 1:
break;
case 2:
if (header.threadKind == 1)
{
if (header.format == 2)
lzw = new LZW1 (data);
else if (header.format == 3)
lzw = new LZW2 (data, header.crc);
else if (header.format == 1)
{
// Huffman Squeeze
System.out.println ("Huffman Squeeze format - not written yet");
}
}
break;
case 3:
if (header.threadKind == 0)
filename = new String (data, 0, header.uncompressedEOF);
break;
default:
System.out.println ("Unknown threadClass: " + header.threadClass);
}
}
public byte[] getData ()
{
return hasDisk () ? lzw.getData () : null;
}
int getCompressedEOF ()
{
return header.compressedEOF;
}
public boolean hasDisk ()
{
return lzw != null;
}
@Override
public String toString ()
{
StringBuilder text = new StringBuilder (header.toString ());
if (filename != null)
text.append ("\n filename .......... " + filename);
else if (message != null)
text.append ("\n message ........... " + message);
else if (lzw != null)
{
text.append ("\n");
text.append (lzw);
}
return text.toString ();
}
class ThreadHeader
{
private final int threadClass;
private final int format;
private final int threadKind;
private final int crc;
private final int uncompressedEOF;
private final int compressedEOF;
public ThreadHeader (byte[] buffer, int offset)
{
threadClass = Utility.getWord (buffer, offset);
format = Utility.getWord (buffer, offset + 2);
threadKind = Utility.getWord (buffer, offset + 4);
crc = Utility.getWord (buffer, offset + 6);
uncompressedEOF = Utility.getLong (buffer, offset + 8);
compressedEOF = Utility.getLong (buffer, offset + 12);
// System.out.println (Utility.toHex (buffer, offset, 16));
}
@Override
public String toString ()
{
StringBuilder text = new StringBuilder ();
text.append (String.format (" threadClass ....... %d %s%n", threadClass,
threadClassText[threadClass]));
text.append (String
.format (" format ............ %d %s%n", format, formatText[format]));
text.append (String.format (" kind .............. %d %s%n", threadKind,
threadKindText[threadClass][threadKind]));
text.append (String.format (" crc ............... %,d%n", crc));
text.append (String.format (" uncompressedEOF ... %,d%n", uncompressedEOF));
text.append (String.format (" compressedEOF ..... %,d (%08X)", compressedEOF,
compressedEOF));
return text.toString ();
}
}
}