public static boolean parse(ByteBuffer buffer, ProtocolDecoderOutput out) throws IOException {
if (buffer.remaining() == 1) { // one byte sanity check
byte[] data = new byte[1];
buffer.get(data);
out.write(new UnknownResponse(0, 0, data));
return true;
}
if (buffer.remaining() < 2) {
return false;
}
byte tag = buffer.get();
int length = Packet.unlength(buffer);
if (buffer.remaining() < length) {
return false;
}
byte[] data = new byte[length];
buffer.get(data);
switch (tag) {
case 0x01:
out.write(HeartbeatAck.parseFrom(data));
return true;
case 0x03:
out.write(LoginResponse.parseFrom(data));
return true;
case 0x04:
out.write(Close.parseFrom(data));
return true;
case 0x07:
out.write(IQStanza.parseFrom(data));
return true;
case 0x08:
out.write(DataMessageStanza.parseFrom(data));
return true;
case 0x0E:
out.write(BindAccountResponse.parseFrom(data));
return true;
default:
out.write(new UnknownResponse(tag, length, data));
return true;
}
}