in proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java [570:622]
private CharBuffer readStringFromComponents(CharsetDecoder decoder) throws CharacterCodingException {
int size = (int)(remaining() * decoder.averageCharsPerByte());
CharBuffer decoded = CharBuffer.allocate(size);
int arrayIndex = currentArrayIndex;
final int viewSpan = limit() - position();
int processed = Math.min(currentArray.length - currentOffset, viewSpan);
ByteBuffer wrapper = ByteBuffer.wrap(currentArray, currentOffset, processed);
CoderResult step = CoderResult.OVERFLOW;
do {
boolean endOfInput = processed == viewSpan;
step = decoder.decode(wrapper, decoded, endOfInput);
if (step.isUnderflow()) {
if (endOfInput) {
step = decoder.flush(decoded);
break;
} if (wrapper.hasRemaining()) {
final int unprocessed = wrapper.remaining();
final byte[] next = contents.get(++arrayIndex);
final ByteBuffer previous = wrapper;
final int nextAmount = Math.min(next.length, viewSpan - processed);
wrapper = ByteBuffer.allocate(unprocessed + nextAmount);
wrapper.put(previous);
wrapper.put(next, 0, nextAmount);
processed += nextAmount;
wrapper.flip();
} else {
final byte[] next = contents.get(++arrayIndex);
final int wrapSize = Math.min(next.length, viewSpan - processed);
wrapper = ByteBuffer.wrap(next, 0, wrapSize);
processed += wrapSize;
}
} else if (step.isOverflow()) {
size = 2 * size + 1;
CharBuffer upsized = CharBuffer.allocate(size);
decoded.flip();
upsized.put(decoded);
decoded = upsized;
continue;
}
} while (!step.isError());
if (step.isError()) {
step.throwException();
}
return (CharBuffer) decoded.flip();
}