Implement setCapacity and duplicate on the Encoder Instruction Parser.

Signed-off-by: Lachlan Roberts <lachlan@webtide.com>
This commit is contained in:
Lachlan Roberts 2021-02-10 19:52:47 +11:00 committed by Simone Bordet
parent 7c34d3c0cd
commit b3cd2a1c27
1 changed files with 97 additions and 15 deletions

View File

@ -20,37 +20,119 @@ import java.nio.ByteBuffer;
*/
public class EncoderInstructionParser
{
private final Handler _handler;
private final NBitIntegerParser _integerParser;
private State _state = State.PARSING;
private enum State
{
PARSING,
SET_CAPACITY,
REFERENCED_NAME,
LITERAL_NAME,
DUPLICATE
}
public interface Handler
{
void onSetDynamicTableCapacity(int capacity);
void onDuplicate(int index);
}
public EncoderInstructionParser(Handler handler)
{
_handler = handler;
_integerParser = new NBitIntegerParser();
}
public void parse(ByteBuffer buffer)
{
byte firstByte = buffer.slice().get();
if ((firstByte & 0x80) != 0)
switch (_state)
{
boolean referenceDynamicTable = (firstByte & 0x40) != 0;
case PARSING:
byte firstByte = buffer.slice().get();
if ((firstByte & 0x80) != 0)
{
_state = State.REFERENCED_NAME;
parseInsertNameWithReference(buffer);
}
else if ((firstByte & 0x40) != 0)
{
_state = State.LITERAL_NAME;
parseInsertWithLiteralName(buffer);
}
else if ((firstByte & 0x20) != 0)
{
_state = State.SET_CAPACITY;
parseSetDynamicTableCapacity(buffer);
}
else
{
_state = State.DUPLICATE;
parseDuplicate(buffer);
}
break;
parseInsertNameWithReference(buffer);
case SET_CAPACITY:
parseSetDynamicTableCapacity(buffer);
break;
case DUPLICATE:
parseDuplicate(buffer);
break;
case LITERAL_NAME:
parseInsertWithLiteralName(buffer);
break;
case REFERENCED_NAME:
parseInsertNameWithReference(buffer);
break;
default:
throw new IllegalStateException(_state.name());
}
else if ((firstByte & 0x40) != 0)
parseInsertWithLiteralName(buffer);
else if ((firstByte & 0x20) != 0)
parseSetDynamicTableCapacity(buffer);
else
parseDuplicate(buffer);
}
private void parseInsertNameWithReference(ByteBuffer buffer)
{
// TODO
// Single bit boolean whether reference is to dynamic or static table.
// Index with 6-bit prefix.
// Single bit wither it is huffman encoded.
// Length of the encoded string.
// The string itself.
}
private void parseInsertWithLiteralName(ByteBuffer buffer)
{
}
private void parseSetDynamicTableCapacity(ByteBuffer buffer)
{
// TODO
// Single bit whether name is huffman encoded.
// Length of name with 5-bit prefix.
// Name bytes.
// Single bit whether value is huffman encoded.
// Value length with 7-bit prefix.
// Value bytes.
}
private void parseDuplicate(ByteBuffer buffer)
{
int index = _integerParser.decode(buffer, 5);
if (index >= 0)
{
_state = State.PARSING;
_handler.onDuplicate(index);
}
}
private void parseSetDynamicTableCapacity(ByteBuffer buffer)
{
int capacity = _integerParser.decode(buffer, 5);
if (capacity >= 0)
{
_state = State.PARSING;
_handler.onSetDynamicTableCapacity(capacity);
}
}
}