Lines 347-352
Link Here
|
347 |
if (!remainder.hasRemaining()) { |
347 |
if (!remainder.hasRemaining()) { |
348 |
remainder = null; |
348 |
remainder = null; |
349 |
} |
349 |
} |
|
|
350 |
if (!result.isUnderflow()) { |
351 |
// perhaps did not fit into 'out' |
352 |
return result; |
353 |
} |
350 |
} |
354 |
} |
351 |
CoderResult result = currentEncoder.encode(in, out, false); |
355 |
CoderResult result = currentEncoder.encode(in, out, false); |
352 |
return result; |
356 |
return result; |
Lines 368-374
Link Here
|
368 |
} |
372 |
} |
369 |
|
373 |
|
370 |
private CoderResult encodeHead (CharBuffer in, ByteBuffer out, boolean flush) { |
374 |
private CoderResult encodeHead (CharBuffer in, ByteBuffer out, boolean flush) { |
371 |
buffer.flip(); |
375 |
// if buffer is missing, get data from the remainder, case for repeated implFlush() call. |
|
|
376 |
CharBuffer b = buffer == null ? remainder : buffer; |
377 |
b.flip(); |
372 |
CoderResult result = null; |
378 |
CoderResult result = null; |
373 |
for (int i=0; i<delegates.size(); i++) { |
379 |
for (int i=0; i<delegates.size(); i++) { |
374 |
currentEncoder=delegates.get(i).newEncoder(); |
380 |
currentEncoder=delegates.get(i).newEncoder(); |
Lines 383-395
Link Here
|
383 |
} |
389 |
} |
384 |
int outPos = out.position(); |
390 |
int outPos = out.position(); |
385 |
try { |
391 |
try { |
386 |
CharBuffer view = buffer.asReadOnlyBuffer(); |
392 |
CharBuffer view = b.asReadOnlyBuffer(); |
387 |
result = currentEncoder.encode(view, out, in==null); |
393 |
result = currentEncoder.encode(view, out, in==null); |
388 |
if (result.isOverflow()) { |
394 |
if (result.isOverflow()) { |
389 |
//Should never happen |
395 |
// the output is smaller, interrupt encoding the head. |
390 |
if (flush) { |
|
|
391 |
currentEncoder.flush(out); |
392 |
} |
393 |
LOG.log(Level.FINEST, ENCODER_SELECTED, currentEncoder); |
396 |
LOG.log(Level.FINEST, ENCODER_SELECTED, currentEncoder); |
394 |
remainder = view; |
397 |
remainder = view; |
395 |
buffer = null; |
398 |
buffer = null; |
Lines 402-409
Link Here
|
402 |
if (in != null) { |
405 |
if (in != null) { |
403 |
result = currentEncoder.encode(in, out, false); |
406 |
result = currentEncoder.encode(in, out, false); |
404 |
} |
407 |
} |
405 |
if (flush) { |
408 |
if (result.isUnderflow()) { |
406 |
result = currentEncoder.flush(out); |
409 |
if (flush) { |
|
|
410 |
result = currentEncoder.flush(out); |
411 |
} |
407 |
} |
412 |
} |
408 |
LOG.log(Level.FINEST, ENCODER_SELECTED, currentEncoder); |
413 |
LOG.log(Level.FINEST, ENCODER_SELECTED, currentEncoder); |
409 |
buffer = null; |
414 |
buffer = null; |
Lines 425-431
Link Here
|
425 |
@Override |
430 |
@Override |
426 |
protected CoderResult implFlush(ByteBuffer out) { |
431 |
protected CoderResult implFlush(ByteBuffer out) { |
427 |
lastByteBuffer = null; |
432 |
lastByteBuffer = null; |
428 |
if (buffer != null) { |
433 |
// if the previous encodeHead overflew, the caller should probably call encodeLoop, but is also |
|
|
434 |
// permitted to call flush -> implFlush again. |
435 |
if (buffer != null || remainder != null) { |
429 |
return encodeHead(null, out, true); |
436 |
return encodeHead(null, out, true); |
430 |
} |
437 |
} |
431 |
else { |
438 |
else { |