2016-08-16 06:34:23 +00:00
|
|
|
package com.bytezone.diskbrowser.wizardry;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
2016-08-16 08:58:42 +00:00
|
|
|
import java.util.Iterator;
|
2016-08-16 06:34:23 +00:00
|
|
|
import java.util.List;
|
|
|
|
|
2016-08-22 03:41:43 +00:00
|
|
|
import com.bytezone.diskbrowser.applefile.AbstractFile;
|
2020-06-26 04:20:01 +00:00
|
|
|
import com.bytezone.diskbrowser.utilities.Utility;
|
2016-08-16 06:34:23 +00:00
|
|
|
|
2020-02-11 07:29:55 +00:00
|
|
|
// -----------------------------------------------------------------------------------//
|
|
|
|
class MessageBlock extends AbstractFile implements Iterable<MessageDataBlock>
|
|
|
|
// -----------------------------------------------------------------------------------//
|
2016-08-16 06:34:23 +00:00
|
|
|
{
|
|
|
|
private final int indexOffset;
|
|
|
|
private final int indexLength;
|
2016-08-22 03:41:43 +00:00
|
|
|
private String text;
|
2016-08-16 06:34:23 +00:00
|
|
|
|
2020-02-02 10:17:49 +00:00
|
|
|
private final List<MessageDataBlock> messageDataBlocks = new ArrayList<> ();
|
2016-08-16 06:34:23 +00:00
|
|
|
|
2020-02-11 07:29:55 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
|
|
|
MessageBlock (byte[] buffer, Huffman huffman)
|
|
|
|
// ---------------------------------------------------------------------------------//
|
2016-08-16 06:34:23 +00:00
|
|
|
{
|
2016-08-22 03:41:43 +00:00
|
|
|
super ("bollocks", buffer);
|
|
|
|
|
2021-05-19 08:13:17 +00:00
|
|
|
indexOffset = Utility.getShort (buffer, 0);
|
|
|
|
indexLength = Utility.getShort (buffer, 2);
|
2016-08-16 06:34:23 +00:00
|
|
|
|
|
|
|
int ptr = indexOffset * 512;
|
|
|
|
|
|
|
|
for (int i = 0, max = indexLength / 2; i < max; i++)
|
|
|
|
{
|
2021-05-19 08:13:17 +00:00
|
|
|
int firstMessageNo = Utility.getShort (buffer, ptr + i * 2);
|
2016-08-16 08:58:42 +00:00
|
|
|
byte[] data = new byte[512];
|
|
|
|
System.arraycopy (buffer, i * 512, data, 0, data.length);
|
2016-08-18 06:35:54 +00:00
|
|
|
MessageDataBlock messageDataBlock = new MessageDataBlock (
|
2016-08-19 09:57:29 +00:00
|
|
|
" Message " + firstMessageNo, data, firstMessageNo, huffman);
|
2016-08-16 06:34:23 +00:00
|
|
|
messageDataBlocks.add (messageDataBlock);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-11 07:29:55 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2016-08-23 14:14:04 +00:00
|
|
|
public String getMessageText (int messageNo)
|
2020-02-11 07:29:55 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2016-08-23 14:14:04 +00:00
|
|
|
{
|
|
|
|
for (int i = 0; i < messageDataBlocks.size (); i++)
|
|
|
|
{
|
|
|
|
MessageDataBlock messageDataBlock = messageDataBlocks.get (i);
|
2016-08-24 10:17:27 +00:00
|
|
|
if (messageDataBlock.lastMessageNo >= messageNo)
|
|
|
|
return messageDataBlock.getText (messageNo);
|
2016-08-23 14:14:04 +00:00
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2020-02-11 07:29:55 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2016-08-24 10:17:27 +00:00
|
|
|
public List<String> getMessageLines (int messageNo)
|
2020-02-11 07:29:55 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2016-08-24 10:17:27 +00:00
|
|
|
{
|
2020-02-02 10:17:49 +00:00
|
|
|
List<String> lines = new ArrayList<> ();
|
2016-08-24 10:17:27 +00:00
|
|
|
|
|
|
|
for (MessageDataBlock messageDataBlock : messageDataBlocks)
|
|
|
|
{
|
|
|
|
if (messageNo > messageDataBlock.lastMessageNo)
|
|
|
|
continue;
|
|
|
|
if (messageNo < messageDataBlock.firstMessageNo)
|
|
|
|
break;
|
|
|
|
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
String message = messageDataBlock.getText (messageNo);
|
|
|
|
if (message != null)
|
|
|
|
{
|
|
|
|
lines.add (message);
|
|
|
|
++messageNo;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return lines;
|
|
|
|
}
|
|
|
|
|
2020-02-11 07:29:55 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2016-08-16 06:34:23 +00:00
|
|
|
public byte[] getMessage (int messageNo)
|
2020-02-11 07:29:55 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2016-08-16 06:34:23 +00:00
|
|
|
{
|
|
|
|
for (int i = 0; i < messageDataBlocks.size (); i++)
|
|
|
|
{
|
|
|
|
MessageDataBlock messageDataBlock = messageDataBlocks.get (i);
|
|
|
|
if (messageDataBlock.firstMessageNo > messageNo)
|
|
|
|
return messageDataBlocks.get (i - 1).getMessage (messageNo);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2020-02-11 07:29:55 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2016-08-22 03:41:43 +00:00
|
|
|
@Override
|
|
|
|
public String getText ()
|
2020-02-11 07:29:55 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2016-08-22 03:41:43 +00:00
|
|
|
{
|
|
|
|
if (text != null)
|
|
|
|
return text;
|
|
|
|
|
|
|
|
StringBuilder text = new StringBuilder ();
|
|
|
|
|
|
|
|
for (MessageDataBlock mdb : messageDataBlocks)
|
|
|
|
{
|
|
|
|
text.append (mdb);
|
|
|
|
text.append ("\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
this.text = text.toString ();
|
|
|
|
|
|
|
|
return this.text;
|
|
|
|
}
|
|
|
|
|
2020-02-11 07:29:55 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2016-08-16 08:58:42 +00:00
|
|
|
@Override
|
|
|
|
public Iterator<MessageDataBlock> iterator ()
|
2020-02-11 07:29:55 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2016-08-16 08:58:42 +00:00
|
|
|
{
|
|
|
|
return messageDataBlocks.iterator ();
|
|
|
|
}
|
2016-08-16 06:34:23 +00:00
|
|
|
}
|