package co.nstant.in.cbor.decoder; import java.io.InputStream; import co.nstant.in.cbor.CborDecoder; import co.nstant.in.cbor.CborException; import co.nstant.in.cbor.model.Array; import co.nstant.in.cbor.model.DataItem; import co.nstant.in.cbor.model.Special; public class ArrayDecoder extends AbstractDecoder<Array> { public ArrayDecoder(CborDecoder decoder, InputStream inputStream) { super(decoder, inputStream); } @Override public Array decode(int initialByte) throws CborException { long length = getLength(initialByte); if (length == INFINITY) { return decodeInfinitiveLength(); } else { return decodeFixedLength(length); } } private Array decodeInfinitiveLength() throws CborException { Array array = new Array(); array.setChunked(true); if (decoder.isAutoDecodeInfinitiveArrays()) { DataItem dataItem; for (;;) { dataItem = decoder.decodeNext(); if (dataItem == null) { throw new CborException("Unexpected end of stream"); } if (Special.BREAK.equals(dataItem)) { array.add(Special.BREAK); break; } array.add(dataItem); } } return array; } private Array decodeFixedLength(long length) throws CborException { Array array = new Array(getPreallocationSize(length)); for (long i = 0; i < length; i++) { DataItem dataItem = decoder.decodeNext(); if (dataItem == null) { throw new CborException("Unexpected end of stream"); } array.add(dataItem); } return array; } }