dmolony-DiskBrowser/src/com/bytezone/diskbrowser/wizardry/MessageDataBlock.java

186 lines
5.4 KiB
Java
Raw Normal View History

2016-08-16 06:34:23 +00:00
package com.bytezone.diskbrowser.wizardry;
import java.util.ArrayList;
import java.util.List;
2016-08-16 08:58:42 +00:00
import com.bytezone.diskbrowser.applefile.AbstractFile;
2020-06-26 04:20:01 +00:00
import com.bytezone.diskbrowser.utilities.HexFormatter;
2016-08-16 06:34:23 +00:00
2020-02-11 07:29:55 +00:00
// -----------------------------------------------------------------------------------//
class MessageDataBlock extends AbstractFile
// -----------------------------------------------------------------------------------//
2016-08-16 06:34:23 +00:00
{
final int firstMessageNo;
2016-08-24 10:17:27 +00:00
final int lastMessageNo;
2016-08-16 06:34:23 +00:00
private final int groupCount;
2020-02-02 10:17:49 +00:00
private final List<Message> messages = new ArrayList<> ();
2016-08-16 06:34:23 +00:00
2016-08-18 06:35:54 +00:00
private final Huffman huffman;
2016-08-16 08:58:42 +00:00
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
MessageDataBlock (String name, byte[] buffer, int firstMessageNo, Huffman huffman)
// ---------------------------------------------------------------------------------//
2016-08-16 06:34:23 +00:00
{
2016-08-16 08:58:42 +00:00
super (name, buffer);
2016-08-19 09:57:29 +00:00
2016-08-16 06:34:23 +00:00
this.firstMessageNo = firstMessageNo;
2016-08-18 06:35:54 +00:00
this.huffman = huffman;
2016-08-16 06:34:23 +00:00
2016-08-16 08:58:42 +00:00
int ptr = 0x1FF; // last byte in block
2016-08-16 06:34:23 +00:00
groupCount = buffer[ptr--] & 0xFF;
int currentMessageNo = firstMessageNo;
2016-08-16 08:58:42 +00:00
int totalMessageBytes = firstMessageNo == 1 ? 4 : 0;
2016-08-16 06:34:23 +00:00
for (int i = 0, max = groupCount - 1; i < groupCount; i++, max--)
{
int huffBytes = buffer[ptr];
for (int j = 0; j < huffBytes; j++)
{
int messageLength = buffer[ptr - j - 1] & 0xFF;
totalMessageBytes += messageLength;
Message message = new Message (currentMessageNo + j,
2016-08-16 08:58:42 +00:00
totalMessageBytes - messageLength, messageLength);
2016-08-16 06:34:23 +00:00
messages.add (message);
}
ptr -= huffBytes;
currentMessageNo += huffBytes;
ptr--;
if (max > 0)
{
byte gap = buffer[ptr--];
int skip = gap & 0xFF;
if ((gap & 0x80) != 0) // is high bit set?
{
gap &= 0x7F;
int gap2 = buffer[ptr--] & 0xFF;
skip = gap * 256 + gap2;
}
skip--;
currentMessageNo += skip;
}
}
2016-08-19 09:57:29 +00:00
if (currentMessageNo > firstMessageNo)
2016-08-24 10:17:27 +00:00
{
lastMessageNo = currentMessageNo - 1;
// this.name += " - " + (currentMessageNo - 1);
}
else
lastMessageNo = firstMessageNo;
// this.name += " - " + lastMessageNo;
setName (getName () + " - " + lastMessageNo);
2016-08-16 06:34:23 +00:00
}
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
2016-08-16 06:34:23 +00:00
byte[] getMessage (int messageNo)
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
2016-08-16 06:34:23 +00:00
{
for (Message message : messages)
if (message.msgNo == messageNo)
{
byte[] returnMessage = new byte[message.length];
System.arraycopy (buffer, message.offset, returnMessage, 0, message.length);
return returnMessage;
}
return null;
}
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
2016-08-23 14:14:04 +00:00
String getText (int messageNo)
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
2016-08-23 14:14:04 +00:00
{
for (Message message : messages)
if (message.msgNo == messageNo)
{
byte[] returnMessage = new byte[message.length];
System.arraycopy (buffer, message.offset, returnMessage, 0, message.length);
return huffman.decodeMessage (returnMessage);
}
2016-08-24 10:17:27 +00:00
return null;
2016-08-23 14:14:04 +00:00
}
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
2016-08-16 08:58:42 +00:00
@Override
public String getText ()
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
2016-08-16 08:58:42 +00:00
{
2016-08-19 09:57:29 +00:00
if (messages.size () == 0)
return "No Messages";
2016-08-16 08:58:42 +00:00
if (huffman == null)
return toString ();
StringBuilder text = new StringBuilder ();
int lastMessageNo = messages.get (0).msgNo - 1;
2016-08-19 09:57:29 +00:00
2016-08-16 08:58:42 +00:00
for (Message message : messages)
{
if (message.msgNo != lastMessageNo + 1)
text.append ("\n");
lastMessageNo = message.msgNo;
byte[] returnMessage = new byte[message.length];
System.arraycopy (buffer, message.offset, returnMessage, 0, message.length);
2016-08-18 06:35:54 +00:00
text.append (String.format ("%5d %s%n", message.msgNo,
huffman.decodeMessage (returnMessage)));
2016-08-16 08:58:42 +00:00
}
if (text.length () > 0)
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
2016-08-16 06:34:23 +00:00
@Override
public String toString ()
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
2016-08-16 06:34:23 +00:00
{
StringBuilder text = new StringBuilder ();
for (Message message : messages)
{
text.append (message);
text.append ("\n");
}
if (text.length () > 0)
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
2016-08-16 06:34:23 +00:00
class Message
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
2016-08-16 06:34:23 +00:00
{
final int msgNo;
final int offset;
final int length;
public Message (int msgNo, int offset, int length)
{
this.msgNo = msgNo;
this.offset = offset;
this.length = length;
}
@Override
public String toString ()
{
StringBuilder text = new StringBuilder ();
2020-06-26 04:20:01 +00:00
String data = HexFormatter.format (buffer, offset, length);
2016-08-16 08:58:42 +00:00
text.append (String.format ("%5d: %03X %02X : %s", msgNo, offset, length, data));
2016-08-16 06:34:23 +00:00
return text.toString ();
}
}
}