private CharBuffer readStringFromComponents()

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();
    }